5

100個の要素のリストがあります。各要素はリストです。このリストには 2 つの要素があります。1 つは単なるキーであり、もう 1 つはマトリックスです。この行列には 5 つの列があります。すべての要素について、これらの各マトリックスから 1 つの列を抽出しようとしています。したがって、基本的には、リストの要素として 100 個の行列を再び持つことになります。リストはこんな感じ

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 つの要素のリストです。私は現在、2番目の要素にのみ興味があります。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(a) が与える

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"
4

2 に答える 2

11

これは、ほとんど使用されていない function の完璧なケースのようです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))
于 2013-04-24T02:26:15.993 に答える
5

これを試して:

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は各サブリストの 2 番目の要素を取り出し、それを外部に渡しsapplyます。(outer)sapply[、渡された各オブジェクトから最初の列を取り出すために使用します。[はプリミティブ関数、つまり位置引数のみを使用する関数であるため、「TRUE」引数を提供する目的であるプレースホルダーを使用する必要があります。その目的は、「1」を 2 番目の引数の位置に「プッシュ」して、行セレクターではなく列セレクターにすることです。

于 2013-04-24T04:20:00.293 に答える