【问题标题】:select specific lines with the data.table package使用 data.table 包选择特定行
【发布时间】:2013-08-09 08:09:26
【问题描述】:

我有以下(简化的)数据集:

df <- data.frame(a=c("A","A","B","B","B"),x=c(1,2,3,3,4))
df
  a x
1 A 1
2 A 2
3 B 3
4 B 3
5 B 4

由于我正在处理大型数据集,因此我使用 data.table 包。

有没有办法在 df 中获取这些行,其中 x 是由 a 分组的最小值。所以在这种情况下,我想选择第 1,3 和 4 行。

类似

df[,min(x),by=a]

但这并没有给我我想要的线条,它只是向我显示按 a 分组的 x 的最小值。

有什么建议吗?

【问题讨论】:

    标签: r data.table


    【解决方案1】:
    library(data.table)
    dt <- data.table(a=c("A","A","B","B","B"), x=c(1,2,3,3,4))
    

    这些只给出唯一的行:

    dt[, .SD[which.min(x)], by=a]
    

    或者:

    setkeyv(dt, c("a","x"))
    dt[unique(dt[,a]), mult="first"]
    

    既然你想拥有所有关系:

    dt[,.SD[x==min(x)], by=a]
    

    你也可以使用:

    setkeyv(dt,c("a","x"))
    dt[dt[unique(dt[,a]), mult="first"]]
    

    如果您的团队很大,这可能会更有效率。

    【讨论】:

    • 他也想要第 4 行!
    • 谢谢。我为此添加了一个解决方案。
    • 谢谢,这很好。但是正如您所说,这可能不是最有效的方式,也许可以摆脱“==”?
    • 查看最后一个解决方案。最有效的方法取决于组的数量和规模。
    • 好吧,创建有代表性的虚拟数据,这样我们就可以测试解决方案了。
    【解决方案2】:

    给你

    R) dt <- data.table(a=c("A","A","B","B","B"),x=c(1,2,3,3,4))
    R) dt[dt[,list(IDX=.I[x==min(x)]),by=a]$IDX]
       a x
    1: A 1
    2: B 3
    3: B 3
    

    如果你想要领带,那应该会更快(我理解你想要的)

    【讨论】:

      猜你喜欢
      • 2015-05-16
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      • 2018-08-24
      相关资源
      最近更新 更多