如何从列表中选择元素作为名称范围来构建新列表?

问题描述 投票:0回答:3

我有一个

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 ...
r list select subset names
3个回答
1
投票

':' 如果您可以使用索引而不是 df-names,那么 Dos 可以工作

lst2 <- spec_list[6:9]

1
投票

这里有一个小函数可以帮助你做到这一点 -

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

1
投票

如果你的列表是一个 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))
© www.soinside.com 2019 - 2024. All rights reserved.