2016-03-22 22 views
1

a ve b listelemeleridir.belirli satırları liste halinde ayıkla

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 ve b'deki satırların satır sayısı aynıdır. Ayık satırlarının b'de 1 değerine eşit olduğu bir form oluşturmasını istiyorum. matris içinde gösterilmez

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

ama ikinci objenin sonucu:

Ben aşağıdaki kodu kullanabilirsiniz

[[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 

bana bu konuda yardımcı olabilir, teşekkür ederim! Biz OP'ın kodunu kullanıyorsanız

+0

, sapply ile sopa (varsayılan DOĞRU olduğu gibi) simplify=FALSE kullanmak istiyorum 2 sütun. Yani, bu – akrun

+0

@akrun için 1 değere sahip olmanın koşulu bu yüzden – lightsnail

cevap

1

Biz

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

deneyebilirsiniz elemanlarının length aynı olduğunda matrix veya vector için list çıkışını kolaylaştırır lapplysapply olarak sapply değiştirin.

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

durumda, `list '` b`, ilk öğe ile bir `matrix` olduğu yılında

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

O ilk elemanındaki her sütuna göre iki matris çıktı etmemiz gerekiyor, ben yine "gevşek ve özlü" bir hata yaptım! Çok teşekkür ederim, akrun! – lightsnail

+1

Anladım! Çok teşekkürler! – lightsnail

İlgili konular