我有一个
spec_list
的列表。我想通过保留AE:SUPPCM
中的元素来获得一个新列表。我该怎么做?
我可以做
lst2 <- spec_list[c('AE', 'SUPPAE', 'CM',' SUPPCM')]
,但是我可以使用AE:SUPPCM
而不是一一列出名字吗?
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 ...
':' 如果您可以使用索引而不是 df-names,那么 Dos 可以工作
lst2 <- spec_list[6:9]
这里有一个小函数可以帮助你做到这一点 -
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
如果你的列表是一个 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 <- \(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)
## 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
也适用于数字,
select(spec_list, 6:9)
当然还有
"data.frame"
s.
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))