提问人:Lukas 提问时间:10/23/2012 更新时间:5/2/2018 访问量:51108
如何从一个列表中的所有嵌套列表中直接选择同一列?
How to directly select the same column from all nested lists within a list?
问:
是否可以直接选择列表中所有嵌套列表的列?
我的列表是使用 aggregate() 和 table() 创建的:
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
我想获取每个表的特定列的向量,例如包含名为“1”的所有列值的向量。
我仍然是一个 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")
请注意,for 和 你需要使用 while for (递归应用),你直接引用列表。lapply()
sapply()
unlist(..., recursive = FALSE)
rapply()
评论
"1"
1
我认为没有明确列出但也有效的一个例子是,如果您有一个带有行和列名称的 data.frames、matrix、xts、zoo 等列表,您可以随后使用以下语法返回整个行、列或集合:
包含格式对象的列表:
0% 1% 10% 50% 90% 99% 100%
Sec.1 -0.0005259283 -0.0002644018 -0.0001320010 -0.00005253342 0.00007852480 0.0002375756 0.0007870917
Sec.2 -0.0006620675 -0.0003931340 -0.0001588773 -0.00005251963 0.00007965378 0.0002121163 0.0004190017
Sec.4 -0.0006091183 -0.0003994136 -0.0001859032 -0.00005230263 0.00010592379 0.0003165986 0.0007870917
Sec.8 -0.0007679577 -0.0005321807 -0.0002636040 -0.00005232452 0.00014492480 0.0003930241 0.0007870917
Sec.16 -0.0009055318 -0.0007448356 -0.0003449334 -0.00005290166 0.00021238287 0.0004772207 0.0007870917
Sec.32 -0.0013007873 -0.0009552231 -0.0005243472 -0.00007836480 0.00028928104 0.0007382848 0.0013002350
Sec.64 -0.0016409500 -0.0012383696 -0.0006617173 -0.00005280668 0.00042354939 0.0011721508 0.0018579966
Sec.128 -0.0022575471 -0.0018858823 -0.0008466965 -0.00005298436 0.00068616576 0.0014665900 0.0027616991
代码(注意空的第一行索引,指定所有行)
simplify2array(lapply(listOfIdenticalObjects,`[`,,"50%"))
输出
ListItem1 ListItem2 ListItem3 ListItem4 ListItem5
Sec.1 -0.00005253342 -0.00004673443 -0.0001112780 -0.00001870960 -0.00002051009
Sec.2 -0.00005251963 -0.00004663200 -0.0001112904 -0.00001878075 0.00000000000
Sec.4 -0.00005230263 -0.00004669297 -0.0001112780 -0.00001869911 -0.00002034403
Sec.8 -0.00005232452 -0.00004663635 -0.0001111296 -0.00001926096 0.00000000000
Sec.16 -0.00005290166 -0.00004668207 -0.0001109570 0.00000000000 0.00000000000
Sec.32 -0.00007836480 0.00000000000 -0.0001111667 -0.00001894496 0.00000000000
Sec.64 -0.00005280668 0.00000000000 -0.0001110926 -0.00001878305 0.00000000000
Sec.128 -0.00005298436 0.00004675191 0.0000000000 -0.00005582568 0.00001020502
评论