【问题标题】:extract specific rows in list提取列表中的特定行
【发布时间】:2016-03-22 16:21:08
【问题描述】:

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 中对象的行数相同。我想从 a 中提取行,其中 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

你能帮帮我吗,谢谢!

【问题讨论】:

  • 在b list 中,第一个元素是具有2 列的matrix。那么,有 1 个值的条件是什么
  • @akrun 所以我们需要根据第一个元素的每一列输出两个矩阵

标签: r list


【解决方案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 或 vector,当元素的 length 相同时。

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

如果我们想坚持使用sapply,请使用simplify=FALSE(默认为TRUE)

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

【讨论】:

  • 哦,我在“lappy and sapply”中又犯了一个错误!非常感谢,akrun!
  • 知道了!!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-03-28
  • 2018-12-06
  • 2021-04-16
  • 2019-06-17
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多