2013-04-24 155 views
2

我有一个包含100个元素的列表。每个元素都是一个列表。这个列表中有两个元素。一个是关键另一个是矩阵。这个矩阵有5列。我试图从这些矩阵的每一个中为所有元素提取一列。所以基本上我会再有100个矩阵作为列表的一个元素。这就是列表的样子从列表中的矩阵中提取一列R

a[[1]] 
    [[1]] 
      [1] "keyid" 

     [[2]] 
       [,1]    [,2]   [,3] [,4] [,5] 
      [1,] "1329397986.572332" "x" "y" "z" "a" 
      [2,] "1329242747.368294" "x" "y" "z" "a" 
      [3,] "1329194224.351232 "x" "y" "z" "a" 

所以你可以在这里看到的是一个列表,它有100个元素。每个元素都是2个元素的列表。我目前只对第二个元素感兴趣。第二个元素有一个矩阵。我想提取这个矩阵的第一列。只看我是否可以将列提取到一个向量中,我可以做

a[[1]][[2]][,1] 

我将所有的值作为向量,如下所示。

a[[1]][[2]][,1] 
     [1] "1329397986.572332" "1329242747.368294" "1329194224.351232" 

但是当我做

x <- lapply(a,function(r){r[[2]][,1]}) 

以下是我的错误。

> x <- lapply(a, function(r){r[[2]][,1]}) 
Error in r[[2]][, 1] : incorrect number of dimensions 

我不知道为什么我这样做。我检查了矩阵元素的尺寸。

> dim(a[[1]][[2]]) 
    [1] 52 5 

它看起来是正确的。所以我不确定错误在哪里。

dput(一)给出

dput(a) 
[[1]] 
[[1]][[1]] 
[1] "keyid" 

[[1]][[2]] 
    [,1]    [,2]   [,3] [,4] [,5] 
[1,] "1329397986.572332" "x" "y"  "z"  "a" 
[2,] "1329242747.368294" "x" "y"  "z"  "a" 
[3,] "1329194224.351232" "x" "y"  "z"  "a" 

[[2]] 
[[2]][[1]] 
[1] "keyid" 

[[2]][[2]] 
    [,1]    [,2]   [,3] [,4] [,5] 
[1,] "1329397986.572332" "x" "y"  "z"  "a" 
[2,] "1329242747.368294" "x" "y"  "z"  "a" 
[3,] "1329194224.351232" "x" "y"  "z"  "a" 

... 

[[100]] 
[[100]][[1]] 
[1] "keyid" 

[[100]][[2]] 
    [,1]    [,2]   [,3] [,4] [,5] 
[1,] "1329397986.572332" "x" "y"  "z"  "a" 
[2,] "1329242747.368294" "x" "y"  "z"  "a" 
[3,] "1329194224.351232" "x" "y"  "z"  "a" 
+1

你可以在这里发布'dput(a)'的输出..很难理解发生了什么,而不会在我们的终端上复制。 – 2013-04-24 02:20:51

+0

'dput(a)'将会非常大,有100个列表条目。我怀疑其中一个是畸形的。 – 2013-04-24 02:25:34

+2

'dput(a)'does * not * give that! – 2013-04-24 02:29:14

回答

9

这似乎对于很少使用的功能rapply一个完美的案例。

直到再现的例子张贴,我将在此作为一个可能的解决方案

set.seed(1) 
# a possible reproducible example 
a <- replicate(5, list('a', matrix(runif(10), ncol=5)), simplify = FALSE) 

# the first column 
a1 <- rapply(a, classes = 'matrix', how = 'list', f = function(x) x[, 1, drop = FALSE]) 
# a second `lapply` is required to drop `NULL` entries 

a1Only <- lapply(a1, Filter, f = Negate(is.null)) 
+0

+1你刚刚通过引入rapply减少了一些烦人的代码。甚至不知道它存在! – 2013-04-24 02:49:33

+0

我不认为这会产生一个类似构成的列表...没有keyid元素。 – 2013-04-24 04:09:49

+0

@Dwin用''keyid'替换''a''? – mnel 2013-04-24 04:18:37

4

尝试这种情况:

a <- list(list("keyid", structure(c("1329397986.572332", "1329242747.368294", 
"1329194224.351232", "x", "x", "x", "y", "y", "y", "z", "z", 
"z", "a", "a", "a"), .Dim = c(3L, 5L))), list("keyid", structure(c("1329397986.572332", 
"1329242747.368294", "1329194224.351232", "x", "x", "x", "y", 
"y", "y", "z", "z", "z", "a", "a", "a"), .Dim = c(3L, 5L)))) 

sapply(lapply(a, "[[" , 2) , "[", TRUE, 1) 
    [,1]    [,2]    
[1,] "1329397986.572332" "1329397986.572332" 
[2,] "1329242747.368294" "1329242747.368294" 
[3,] "1329194224.351232" "1329194224.351232" 

说明:内lapply拉出第二元件中的每个子列表,将它传递到外部sapply。 (外部)sapply使用[从传递给它的每个对象中拉出第一列。由于[是一个原始函数,因此.i.e。一个只使用位置参数,你需要使用一个占位符来提供“TRUE”参数。其目的是将“1”“推”到第二个参数位置,从而使其成为列选择器而不是行选择器。