是否可以直接选择列表中所有嵌套列表的列?
我的列表是使用带有表()的aggregate()创建的:
AgN=aggregate(data,by=list(d$date),FUN=table,useNA="no")
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
我想获得每个表的特定列的 vector ,例如一个包含所有名为“1”的列的值的 vector 。
我仍然是R的初学者,但是即使经过长时间的搜索和尝试,我仍然没有找到好的解决方案。如果我想获取列表的字段,可以简单地用方括号将其编入索引,例如[i,j]。
在网上,我找到了一些矩阵示例,所以我尝试做同样的事情,首先,只选择了一个嵌套列表的
AgN$x[1][1]
列,但仍在选择整个列表:$
0
1 2 3 8 11
0.447204969 0.438509317 0.096894410 0.009937888 0.007453416
我的下一个尝试是
AgN$x[[1]][1]
,它正在工作:1
0.447205
所以我试图以同样的方式选择所有嵌套列表的每个第一列的值:
AgN$x[[1:length(AgN$x]][1]
Recursive indexing failed at level 2
显然问题是如果使用双括号,则禁止选择范围。
我最后的尝试是使用一个for循环:
cduR=NULL
for (i in 1:length(AgN$x)){
t=AgN$x[[i]]
cduR=c(cduR,as.vector(t["1"]))
}
最后,到目前为止,这似乎可行。但是那样的话,每次选择列时,我都必须建立一个循环。有没有直接的方法?
谢谢你的帮助。
最佳答案
假设您有类似以下内容:
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
使用
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
语法的其他变体也可以帮助您:
## 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]]))
嵌套列表示例
如果您确实有嵌套列表(列表中的列表),请尝试以下变体。
# 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")
请注意,对于
lapply()
和sapply()
,您需要使用unlist(..., recursive = FALSE)
;而对于rapply()
(递归应用),则直接引用该列表。
关于r - 如何直接从列表中的所有嵌套列表中选择同一列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13016359/