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 :(得分:1)
我们可以尝试
lapply(seq_along(a), function(i)
lapply(split(b[[i]], col(b[[i]])),
function(x) a[[i]][as.logical(x),]))
如果我们使用OP的代码,请将sapply
更改为lapply
,sapply
将list
输出简化为matrix
或{{ 1}}当元素的vector
相同时。
length
如果我们想坚持Map(function(a,b) lapply(1:ncol(b),
function(x) {a[which(b[,x]==1),]}), a,b)
,请使用sapply
(默认为TRUE)
simplify=FALSE