【问题标题】:list of data.table: filter by variabledata.table 列表:按变量过滤
【发布时间】:2019-08-19 12:04:56
【问题描述】:

我有一个 data.tables 列表

library(data.table); set.seed(42)
l <- list(data.table(id=1:5, x=rnorm(5)), data.table(id=1:5, x=rnorm(5)))

> l
[[1]]
   id          x
1:  1  1.3709584
2:  2 -0.5646982
3:  3  0.3631284
4:  4  0.6328626
5:  5  0.4042683

[[2]]
   id           x
1:  1 -0.10612452
2:  2  1.51152200
3:  3 -0.09465904
4:  4  2.01842371
5:  5 -0.06271410

每个都具有相同的 ID。

我想从每个元素中只提取 ID 3,但不知道这是如何工作的。我想到了lapply(l, ),但不知道如何继续。每个列表元素是否有一个备用变量,比如xx,所以我可以使用lapply(l,subset(xx, id==3))

【问题讨论】:

  • 这工作lapply(l,function(t) t[which(t$id ==3),] )。对于列表中的每个元素 (t),您需要提取具有 id == 3 的行。 subset 也应该可以工作。
  • 我明白了!事实上lapply(l,function(t) t[id==3]) 也有效! function(t) ... 到底是做什么的?我一直看到这个“技巧”,但永远不会猜到这可能是一个解决方案。我知道它介绍了我正在寻找的“句柄”,但我不太明白它的一般作用。
  • 将函数t[which(t$id ==3),] (或t[id==3])应用于t的每个值。和for(t in l){print(t[id==3])}一样
  • 这是一个anonymous function,它允许您将比单参数函数更复杂的东西传递给lapply
  • 谢谢!我想我现在已经掌握了窍门。

标签: r list data.table


【解决方案1】:

使用data.table 子集(应该更快):

lapply(l, "[", id == 3)

【讨论】:

    【解决方案2】:

    在这种情况下,我们可以在没有匿名调用的情况下使用subset

    lapply(l, subset, id == 3)
    
    #[[1]]
    #   id         x
    #1:  3 0.3631284
    
    #[[2]]
    #   id           x
    #1:  3 -0.09465904
    

    【讨论】:

      【解决方案3】:

      另一个选项是map 来自tidyverse

      library(tidyverse)
      map(l, ~ .x %>%
                     filter(id == 3))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-01
        • 2021-07-23
        • 2017-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多