R 从由列表组成的列表中提取列

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是包含以下列表的列表:

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