2016-03-24 14 views
2

一个是包含列表清单:提取塔它是由清单

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

@rawr你让我碰到“rapply”,谢谢! – lightsnail

+1

@rawr - 这真的应该是这里的答案 - 它是通用和可扩展的 – thelatemail

回答

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的解决方案,它允许我们通过使用rapply保留原来list结构中的所有信贷,看到?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 
+0

unlist(a,recursive = FALSE)是惊人的!虽然结果不在列表结构中,但是这个代码非常棒!我试过unlist(a),只有一系列数字。 “递归= FALSE”很有帮助!非常感谢! – lightsnail

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 

注意这也要求我们知道我们只列出扩展两个层次。