【问题标题】:faster way of finding max/min of a given column for each value of another column and then subset to those rows为另一列的每个值查找给定列的最大值/最小值的更快方法,然后将其子集到这些行
【发布时间】:2016-05-09 05:49:38
【问题描述】:

我目前正在我的 data.table dat 上执行以下操作,这是参与我的代码的最长时间。

dat[ , max_ts:= max(TS, na.rm = T), .(col_new)]
dat_new <- dat[TS == max_ts, ]

我在上面所做的是,首先我为col_new 列的每个值/类别找到最大值TS,然后只保留出现最大值TS 的那些行。

我的目标是达到dat_new

我需要在循环中对不同的数据表执行上述操作。 (这里的时间有点难切,请不要在此提出任何建议)

我希望以更快的方式完成以上 2 个步骤。有没有更好、更有效的方法来做同样的事情?

【问题讨论】:

  • 请展示一个可重现的例子

标签: r data.table subset


【解决方案1】:

我们可以使用.I 来获取行索引并以此为基础对行进行子集化。它应该更快。

dat[dat[ , .I[which.max(TS)], .(col_new)]$V1]

在这里,我假设max 没有联系。如果有,那么

dat[dat[, .I[TS == max(TS, na.rm=TRUE)], .(col_new)]$V1]

【讨论】:

  • 订购它并采用“最后一个”值会提供任何速度吗? dat[ dat[order(TS), .I[.N], by = .(col_new)]$V1 ] - 我想这不会处理 NAs...
  • @Symbolix 我认为使用setorder.I 会更快。但是,如果有平局,那么每个“col_new”只会得到一行
  • @akrun 在我的案例中会有联系,但我只想保留第一个案例出现在这些案例中。那么,您可以使用setorder 进一步优化您的解决方案吗?正如您提到的那样。
猜你喜欢
  • 2015-01-09
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多