R 从由列表组成的列表中提取列
a是包含以下列表的列表:R 从由列表组成的列表中提取列,r,list,matrix,R,List,Matrix,a是包含以下列表的列表: a<-list(list(matrix(c(0,0,0,1,2,1,2,2,2,1,1,1),3), matrix(c(0,0,1,2,2,2,2,1),2)), list(matrix(c(0,0,1,2,2,1,1,1,2,2,2,2),3))) > a [[1]] [[1]][[1]] [,1] [,2] [,3] [,4] [1,] 0 1 2 1 [2,] 0
a<-list(list(matrix(c(0,0,0,1,2,1,2,2,2,1,1,1),3),
matrix(c(0,0,1,2,2,2,2,1),2)),
list(matrix(c(0,0,1,2,2,1,1,1,2,2,2,2),3)))
> a
[[1]]
[[1]][[1]]
[,1] [,2] [,3] [,4]
[1,] 0 1 2 1
[2,] 0 2 2 1
[3,] 0 1 2 1
[[1]][[2]]
[,1] [,2] [,3] [,4]
[1,] 0 1 2 2
[2,] 0 2 2 1
[[2]]
[[2]][[1]]
[,1] [,2] [,3] [,4]
[1,] 0 2 1 2
[2,] 0 2 1 2
[3,] 1 1 2 2
它是可以解决的,但我想知道是否有更方便的方法来解决这个问题,因为我需要在以后根据这个问题做更多的工作。谢谢大家! 我认为以下方法有效:
sapply(unlist(a, recursive = FALSE), function(x) x[ , 1])
# [[1]]
# [1] 0 0 0
#
# [[2]]
# [1] 0 0
#
# [[3]]
# [1] 0 0 1
如果a
上的嵌套超出了一个级别,那么这将不起作用
由于@rawr提供的解决方案允许我们通过使用rappy
保留原始列表结构,因此所有信用都应归于@rawr,更多信息请参见?rappy
:
rapply(a, function(x) x[,1], how = "list")
# [[1]]
# [[1]][[1]]
# [1] 0 0 0
#
# [[1]][[2]]
# [1] 0 0
#
#
# [[2]]
# [[2]][[1]]
# [1] 0 0 1
类似地,我认为另一种解决方案可能是嵌套的lappy函数。不过,这里的事情可能会变得相当棘手
代码是:
lapply(a, function(x) lapply(x,
function(x) x[,1]))
我们实际上是在列表上向下两级(通过调用lappy两次),然后提取第一列(使用x[,1])
结果是:
[[1]]
[[1]][[1]]
[1] 0 0 0
[[1]][[2]]
[1] 0 0
[[2]]
[[2]][[1]]
[1] 0 0 1
请注意,这也要求我们知道我们的列表只扩展了两个级别。unlist(a,recursive=FALSE)令人惊讶!虽然结果不是在列表结构中,但是这段代码很棒!我试过取消列表(a),只得到了一系列的数字。“recursive=FALSE”很有用!非常感谢你@如果你让我遇到“rapply”,谢谢你@rawr-这应该是这里的答案-它是通用的和可扩展的
[[1]]
[[1]][[1]]
[1] 0 0 0
[[1]][[2]]
[1] 0 0
[[2]]
[[2]][[1]]
[1] 0 0 1