2016-03-24 18 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 

注意這也要求我們知道我們只列出擴展兩個層次。