英文:
How to select elements from a list as a range of names to build a new list?
问题
我有一个名为 spec_list
的列表。我想通过保留其中来自 AE:SUPPCM
的元素来获取一个新的列表。如何做到这一点?
我可以使用以下代码来实现:lst2 <- spec_list[c('AE', 'SUPPAE', 'CM', 'SUPPCM')]
,但我可以使用 AE:SUPPCM
来代替一个个列出名称吗?
str(spec_list, 1)
# 一个包含9个元素的列表
# $ README : chr "foobar"
# $ SIGN_OFF : logi TRUE
# $ REVISION_HISTORY: logi NA
# $ Study : num 12345
# $ Datasets :List of 2
# $ AE : chr "yes"
# $ SUPPAE : int [1:10] 1 2 3 4 5 6 7 8 9 10
# $ CM : num 1.23e+08
# $ SUPPCM : int [1:3, 1:4] 1 2 3 4 5 6 7 8 9 10 ...
英文:
I have a list of spec_list
. I would like to get a new list by keeping elements from AE:SUPPCM
. How can I do that?
I can do lst2 <- spec_list[c('AE', 'SUPPAE', 'CM',' SUPPCM')]
, but can I do this using AE:SUPPCM
instead of listing the names one by one?
str(spec_list, 1)
# List of 9
# $ README : chr "foobar"
# $ SIGN_OFF : logi TRUE
# $ REVISION_HISTORY: logi NA
# $ Study : num 12345
# $ Datasets :List of 2
# $ AE : chr "yes"
# $ SUPPAE : int [1:10] 1 2 3 4 5 6 7 8 9 10
# $ CM : num 1.23e+08
# $ SUPPCM : int [1:3, 1:4] 1 2 3 4 5 6 7 8 9 10 ...
答案1
得分: 2
以下是代码的中文翻译:
这是一个可以帮助你实现这个功能的小函数 -
select_by_names <- function(data, x, y) {
nm <- names(data)
data[match(x, nm) : match(y, nm)]
}
我创建了自己的示例来展示这个函数的工作方式。
tmp <- head(mtcars, 2)
spec_list <- list(README = tmp, `SIGN-OFF` = tmp, `REVISION HISTORY` = tmp,
AE = tmp, SUPPAE = tmp, CM = tmp, SUPPCM = tmp)
select_by_names(spec_list, 'AE', 'SUPPCM')
#$AE
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
#$SUPPAE
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
#$CM
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
#$SUPPCM
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
还有另一个示例 -
select_by_names(spec_list, 'SIGN-OFF', 'CM')
#$`SIGN-OFF`
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
#$`REVISION HISTORY`
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
#$AE
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
#$SUPPAE
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
#$CM
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
希望这对你有帮助!
英文:
Here's a small function that can help you do that -
select_by_names <- function(data, x, y) {
nm <- names(data)
data[match(x, nm) : match(y, nm)]
}
I have created my own example to show how this function works.
tmp <- head(mtcars, 2)
spec_list <- list(README = tmp, `SIGN-OFF` = tmp, `REVISION HISTORY` = tmp,
AE = tmp, SUPPAE = tmp, CM = tmp, SUPPCM = tmp)
select_by_names(spec_list, 'AE', 'SUPPCM')
#$AE
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
#$SUPPAE
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
#$CM
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
#$SUPPCM
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
and another one -
select_by_names(spec_list, 'SIGN-OFF', 'CM')
#$`SIGN-OFF`
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
#$`REVISION HISTORY`
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
#$AE
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
#$SUPPAE
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
#$CM
# mpg cyl disp hp drat wt qsec vs am gear carb
#Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
#Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
答案2
得分: 2
以下是翻译的部分:
这在你的列表是数据框架(data.frame)时很容易。
subset(head(mtcars), select=qsec:carb)
# qsec vs am gear carb
# Mazda RX4 16.46 0 1 4 4
# Mazda RX4 Wag 17.02 0 1 4 4
# Datsun 710 18.61 1 1 4 1
# Hornet 4 Drive 19.44 1 0 3 1
# Hornet Sportabout 17.02 0 0 3 2
# Valiant 20.22 1 0 3 1
它调用了subset.data.frame
,我们可以稍微修改以使其适用于列表。
select <- function(x, select, ...) {
if (missing(select)) {
vars <- rep_len(TRUE, length(x))
} else {
nl <- as.list(seq_along(x))
names(nl) <- names(x)
vars <- eval(substitute(select), nl, parent.frame())
}
x[vars]
}
用法
select(x=spec_list, select=AE:SUPPCM)
## 或者简写
select(spec_list, AE:SUPPCM)
# $AE
# [1] "yes"
#
# $SUPPAE
# [1] 1 2 3 4 5 6 7 8 9 10
#
# $CM
# [1] 123248756
#
# $SUPPCM
# [,1] [,2] [,3] [,4]
# [1,] 1 4 7 10
# [2,] 2 5 8 11
# [3,] 3 6 9 12
也适用于数字,
select(spec_list, 6:9)
当然也适用于“data.frame”:
select(mtcars, qsec:carb)
数据:
spec_list <- list(README='foobar', SIGN_OFF=TRUE, REVISION_HISTORY=NA,
Study=12345, Datasets=list(iris, mtcars), AE='yes',
SUPPAE=1:10, CM=123248756, SUPPCM=matrix(1:12, 3, 4))
英文:
This is easy if your list was a data.frame.
subset(head(mtcars), select=qsec:carb)
# qsec vs am gear carb
# Mazda RX4 16.46 0 1 4 4
# Mazda RX4 Wag 17.02 0 1 4 4
# Datsun 710 18.61 1 1 4 1
# Hornet 4 Drive 19.44 1 0 3 1
# Hornet Sportabout 17.02 0 0 3 2
# Valiant 20.22 1 0 3 1
It dispatches to subset.data.frame
, which we can slightly change to make it work for lists.
select <- \(x, select, ...) {
if (missing(select)) {
vars <- rep_len(TRUE, length(x))
} else {
nl <- as.list(seq_along(x))
names(nl) <- names(x)
vars <- eval(substitute(select), nl, parent.frame())
}
x[vars]
}
Usage
select(x=spec_list, select=AE:SUPPCM)
## or shortly
select(spec_list, AE:SUPPCM)
# $AE
# [1] "yes"
#
# $SUPPAE
# [1] 1 2 3 4 5 6 7 8 9 10
#
# $CM
# [1] 123248756
#
# $SUPPCM
# [,1] [,2] [,3] [,4]
# [1,] 1 4 7 10
# [2,] 2 5 8 11
# [3,] 3 6 9 12
Also works with numbers,
select(spec_list, 6:9)
and of course with "data.frame"
s.
select(mtcars, qsec:carb)
Data:
spec_list <- list(README='foobar', SIGN_OFF=TRUE, REVISION_HISTORY=NA,
Study=12345, Datasets=list(iris, mtcars), AE='yes',
SUPPAE=1:10, CM=123248756, SUPPCM=matrix(1:12, 3, 4))
答案3
得分: 1
": "如果您愿意使用索引而不是数据帧名称,lst2
会起作用。
英文:
':' Dos work if you are ok with using the index and not the df-names
lst2 <- spec_list[6:9]
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论