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
我想提取所有对象的第一列。我们知道如果列表是由矩阵组成的,我们可以用“Map”函数来解决这个问题,但是现在列表是由列表组成的,我们不能用“Map”来解决这个问题,怎么办呢这很容易吗?
我使用以下代码来解决此问题:
sapply(1:length(a), function(x) {Map(function(y) y[,1],a[[x]])})
它可以解决,但我想知道是否有更方便的方法来解决这个问题,因为我需要在以后根据这个问题做更多的工作。谢谢!
答案 0 :(得分:5)
我认为以下工作:
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而导致我们使用list
保留原始rapply
结构的解决方案的所有信用,请参阅?rapply
了解更多信息:
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
答案 1 :(得分:1)
同样,我认为另一种解决方案可能是嵌套的lapply函数。事情可能会变得非常棘手。
代码是:
lapply(a, function(x) lapply(x,
function(x) x[,1]))
我们基本上是在列表中的两个级别(通过调用lapply两次)然后提取第一列(使用x [,1])。
结果是:
[[1]]
[[1]][[1]]
[1] 0 0 0
[[1]][[2]]
[1] 0 0
[[2]]
[[2]][[1]]
[1] 0 0 1
请注意,这也要求我们知道我们的列表只扩展了两个级别。