是否可以直接选择列表中所有嵌套列表的列?
我的列表是使用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"]))
}
最后,到目前为止似乎有效。但是这样我每次想要选择列时都必须构建一个循环。有没有直接的方式?
感谢您的帮助。
答案 0 :(得分:50)
假设您有以下内容:
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()
,您可以直接参考该列表。
答案 1 :(得分:0)
我认为没有明确列出的一个例子,但是如果你有一个包含行名和列名的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