提取列表中的特定行

时间:2016-03-22 16:21:09

标签: r list

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
你可以帮助我吗,谢谢你!

1 个答案:

答案 0 :(得分:1)

我们可以尝试

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

如果我们使用OP的代码,请将sapply更改为lapplysapplylist输出简化为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