如何直接从列表中的所有嵌套列表中选择相同的列?

Luk*_*kas 28 r nested-lists

是否可以直接选择列表中所有嵌套列表的列?
我的列表是使用aggregate()和table()创建的:

AgN=aggregate(data,by=list(d$date),FUN=table,useNA="no")
Run Code Online (Sandbox Code Playgroud)

AgN$x 好像:

$`0`

      1           2           3           9          11 
0.447204969 0.438509317 0.096894410 0.009937888 0.007453416 

$`1`

          1           2           4           8          11 
0.489974937 0.389724311 0.102756892 0.006265664 0.011278195 

…

$n
Run Code Online (Sandbox Code Playgroud)

我想获得每个表的特定列的向量,例如包含名为"1"的所有列的值的向量.我仍然是R初学者,但即使经过长时间的搜索和尝试,我找不到好的解决方案.如果我想获得列表的字段,我可以简单地用括号对其进行索引,例如[i,j].
在线我发现了一些矩阵的例子,所以我尝试做同样的事情,首先只选择一个嵌套列表的列AgN$x[1][1],但是仍然选择一个完整的列表:

$0

     1           2           3           8          11 
Run Code Online (Sandbox Code Playgroud)

0.447204969 0.438509317 0.096894410 0.009937888 0.007453416

我的下一次尝试是AgN$x[[1]][1],它正在工作:

  1 
Run Code Online (Sandbox Code Playgroud)

0.447205

所以我试图选择所有嵌套列表的每个第一列的值:

AgN$x[[1:length(AgN$x]][1]
Recursive indexing failed at level 2
Run Code Online (Sandbox Code Playgroud)

显然问题是如果使用双括号则禁止选择范围.

我的最后一次尝试是使用for循环:

cduR=NULL 
for (i in 1:length(AgN$x)){
t=AgN$x[[i]]
cduR=c(cduR,as.vector(t["1"]))
}
Run Code Online (Sandbox Code Playgroud)

最后,到目前为止似乎有效.但是这样我每次想要选择列时都必须构建一个循环.有没有直接的方法?

谢谢你的帮助.

A5C*_*2T1 53

假设您有以下内容:

myList <- list(`0` = c(`1` = 10, `2` = 20, `3` = 30, `4` = 72),
               `1` = c(`1` = 15, `2` = 9, `3` = 7))
myList
# $`0`
#  1  2  3  4 
# 10 20 30 72 
# 
# $`1`
#  1  2  3 
# 15  9  7 
Run Code Online (Sandbox Code Playgroud)

使用sapply()lapply()进入列表并提取所需的列.一些例子.

# As a list of one-column data.frames
lapply(myList, `[`, 1)
# $`0`
#  1 
# 10 
# 
# $`1`
#  1 
# 15 

# As a list of vectors
lapply(myList, `[[`, 1)
# $`0`
# [1] 10
# 
# $`1`
# [1] 15

# As a named vector
sapply(myList, `[[`, 1)
#  0  1 
# 10 15 

# As an unnamed vector
unname(sapply(myList, `[[`, 1))
# [1] 10 15
Run Code Online (Sandbox Code Playgroud)

语法的其他变体也可以帮助您:

## Same output as above, different syntax
lapply(myList, function(x) x[1])
lapply(myList, function(x) x[[1]])
sapply(myList, function(x) x[[1]])
unname(sapply(myList, function(x) x[[1]]))
Run Code Online (Sandbox Code Playgroud)

嵌套列表示例

如果您确实有嵌套列表(列表中的列表),请尝试以下变体.

# An example nested list
myNestedList <- list(A = list(`0` = c(`1` = 10, `2` = 20, `3` = 30, `4` = 72),
                              `1` = c(`1` = 15, `2` = 9, `3` = 7)),
                     B = list(`0` = c(A = 11, B = 12, C = 13),
                              `1` = c(X = 14, Y = 15, Z = 16)))

# Run the following and see what you come up with....
lapply(unlist(myNestedList, recursive = FALSE), `[`, 1)
lapply(unlist(myNestedList, recursive = FALSE), `[[`, 1)
sapply(unlist(myNestedList, recursive = FALSE), `[[`, 1)
rapply(myNestedList, f=`[[`, ...=1, how="unlist")
Run Code Online (Sandbox Code Playgroud)

请注意,对于lapply()(sapply()您需要使用unlist(..., recursive = FALSE)while)rapply()(递归应用),您可以直接引用该列表.