2016-03-22 6 views
1

aおよびbはリストです。リスト内の特定の行を抽出する

a<-list(matrix(1:36,9),matrix(7:38,8)) 
b<-list(matrix(c(1,1,1,1,0,0,1,0,1,1,0,0,0,1,1,1,0,0),9),matrix(c(1,0,0,1,0,0,0,1),8)) 

aとbのオブジェクトの行番号は同じです。私は、行の抽出行がbの値1と等しい場所にしたい。

私は、次のコードを使用し

Map(function(a,b) sapply(1:ncol(b), function(x) {a[which(b[,x]==1),]}), a,b) 

をしかし、第二の目的の結果は、マトリクス状に表示されていない:

[[1]] 
[[1]][[1]] 
    [,1] [,2] [,3] [,4] 
[1,] 1 10 19 28 
[2,] 2 11 20 29 
[3,] 3 12 21 30 
[4,] 4 13 22 31 
[5,] 7 16 25 34 
[6,] 9 18 27 36 

[[1]][[2]] 
    [,1] [,2] [,3] [,4] 
[1,] 1 10 19 28 
[2,] 5 14 23 32 
[3,] 6 15 24 33 
[4,] 7 16 25 34 


[[2]] 
     [,1] 
[1,] 7 
[2,] 10 
[3,] 14 
[4,] 15 
[5,] 18 
[6,] 22 
[7,] 23 
[8,] 26 
[9,] 30 
[10,] 31 
[11,] 34 
[12,] 38 

あなたはあなたに感謝し、それに私を助けることができます!

+0

、最初の要素が持つ' matrix'です2列。だから、そのために1つの値を持つ条件は – akrun

+0

@akrunだから、最初の要素の各列に従って2つの行列を出力する必要があります – lightsnail

答えて

1

我々はOPのコードを使用している場合は要素のlengthが同じである場合、sapplyとしてlapplyへの変更sapplymatrixまたはvectorlist出力を簡素化

lapply(seq_along(a), function(i) 
    lapply(split(b[[i]], col(b[[i]])), 
     function(x) a[[i]][as.logical(x),])) 

を試すことができます。 'B' `list`で

場合
Map(function(a,b) lapply(1:ncol(b), 
     function(x) {a[which(b[,x]==1),]}), a,b) 

、我々は(デフォルトはTRUEであるとして)simplify=FALSEを使用し、sapplyに固執したい

Map(function(a,b) sapply(1:ncol(b), 
     function(x) {a[which(b[,x]==1),]}, simplify=FALSE), a,b) 
+1

O、私は "lappy and sapply"で再び間違いを犯しました! akrun! – lightsnail

+1

これはありがとう!ありがとう! – lightsnail

関連する問題