访问R中列表列表的选定元素

时间:2014-03-04 14:38:05

标签: r

我有一个此类型的列表subgame[[i]]$Weight

[[1]]
[1] 0.4720550 0.4858826 0.4990469 0.5115899 0.5235512 0.5349672 0.5458720
[8] 0.5562970 0.5662715 0.5758226 0.5849754 0.5937532 0.6021778 0.6102692
[15] 0.6180462 0.6255260 0.6327250 0.6396582 0.6463397 0.6527826

[[2]]
[1] 0.4639948 0.4779027 0.4911519 0.5037834 0.5158356 0.5273443 0.5383429
[8] 0.5488623 0.5589313 0.5685767 0.5778233 0.5866943 0.5952111 0.6033936
[15] 0.6112605 0.6188291 0.6261153 0.6331344 0.6399002 0.6464260

[[3]]
[1] 0.4629488 0.4768668 0.4901266 0.5027692 0.5148329 0.5263534 0.5373639
[8] 0.5478953 0.5579764 0.5676339 0.5768926 0.5857755 0.5943041 0.6024984
[15] 0.6103768 0.6179568 0.6252543 0.6322844 0.6390611 0.6455976

我正在寻找的是访问每个列表中的所有j-th元素。如果j=1我必须得到的示例:

>0.4720550  0.4639948 0.4629488

我该怎么办? 我找到了

sapply(1:length(subgame[[i]]$Weight),function(k) subgame[[i]]$Weight[[k]][1])

但对我来说似乎太棘手了。 还有一种更优雅的方式吗?

2 个答案:

答案 0 :(得分:3)

如果j=1,那么您对subgame[[i]]$Weight[[1]][1]subgame[[i]]$Weight[[2]][1]subgame[[i]]$Weight[[3]][1]感兴趣。换句话说,您希望在每个列表元素上使用[1]

但是当您对矢量进行子集时会发生什么?例如:

(x <- rnorm(5))
# [1] -1.8965529  0.4688618  0.6588774  0.2749539  0.1829046
x[3]
# [1] 0.6588774

[实际上是一个函数,它会在这种情况下被调用。你可以用?"["阅读更多关于它的内容,但关键是你可以像任何其他函数一样调用它。它的第一个参数将是子集的对象,然后你可以传递你感兴趣的索引(或索引)(以及帮助页面讨论的其他一些参数):

x[3]
# [1] 0.6588774
`[`(x, 3)
# [1] 0.6588774

请注意名称周围的反引号。裸[会抛出错误,因此您需要引用它。其他功能也是如此,例如+

因此,如果您想获取每个列表元素的第一个元素,可以将[应用于列表的每个元素,并将其传递给1或其他j

sapply(subgame[[i]]$Weight, `[`, 1)

答案 1 :(得分:0)

我想添加一个解决方案,该解决方案会为Weight列表的每个元素的subgame列表返回所需的结果。

> subgame <- list(list(weight = list(c(1, 2), c(3, 4), c(5, 6))), list(weight = list(c(7, 8), c(9, 10), c(11, 12))))
> 
> j = 1
> 
> do.call(rbind, subgame[[1]]$weight)[,j]
[1] 1 3 5
>  
> lapply(subgame, function(x) {do.call(rbind, x$weight)[,j]})
[[1]]
[1] 1 3 5

[[2]]
[1]  7  9 11