【问题标题】:With data.table, is SD[which.max(Var1)] the fastest way to find the max of a group? [duplicate]使用 data.table,SD[which.max(Var1)] 是找到组最大值的最快方法吗? [复制]
【发布时间】:2014-06-18 15:19:51
【问题描述】:

如果需要,我可以整理一个数据集,但我的问题有点笼统。

accts <- accts[, .SD[which.max(EE)], by=DnB.Name]

我有大约 350k 行的 DT,并且一些 DnB.Name(Duns 和 Bradstreet 公司名称)是具有不同员工人数 (EE) 的重复项,我只关心每个人的最高数量,可以忽略其余的。

不管怎样,DT 通常是闪电般的快,所以我想我一定是做错了什么?

【问题讨论】:

  • 可能与使用 .SD 有关,这意味着您必须为每个 by 组加载整个 data.table 块。见这里:stackoverflow.com/questions/12707368/…
  • 目前最快的方法是使用.I,而不是here。在你的情况下,只需将里面的表达式替换为.I[which.max(..)]

标签: r data.table


【解决方案1】:

按 EE 排序,然后使用自联接获取每个组的第一行:

 ordered<-accts[order(-EE)] #Descending order
 setkey(ordered,DnB.Name) #must setkey before join
 ordered[J(unique(DnB.Name)),mult="first"]

作为参考,请查看交叉验证上的这篇文章:https://stats.stackexchange.com/questions/7884/fast-ways-in-r-to-get-the-first-row-of-a-data-frame-grouped-by-an-identifier

编辑:更快,但语法奇怪:

accts[accts[, .I[which.max(EE)], by = DnB.Name]$V1]

作为参考,请查看此帖子并提出类似问题: Subset by group with data.table

【讨论】:

  • 聪明,但仍然很慢。但我认为这是正确的方向。我将如何保留每个 DnB.Name 的第一个实例但在没有 .SD 的情况下删除重复项,因为我认为发生的情况是,由于重复项很少见,它的子集化次数为 340k 次
  • 尝试自加入方法
  • 什么是 ID 变量?
  • 抱歉,我的想法很一般,已更新为 DnB.name。这应该是闪电般的速度。
  • 我明白了,必须保留第一行,跳过第二行,然后继续编辑,但 ID 应该是 DnB.Name。辉煌,超级疯狂的快。进行最后的编辑,我会给你打勾:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多