【问题标题】:Return subset of rows based on aggregate of keyed rows [duplicate]基于键控行的聚合返回行的子集[重复]
【发布时间】:2016-08-24 07:57:34
【问题描述】:

我想根据行子集上的聚合函数在每个子集中对 R 中的数据表进行子集化。例如,对于每个键,返回大于仅为子集中的行计算的字段平均值的所有值。示例:

library(data.table)
t=data.table(Group=rep(c(1:5),each=5),Detail=c(1:25))
setkey(t,'Group')
library(foreach)
library(dplyr)

ret=foreach(grp=t[,unique(Group)],.combine=bind_rows,.multicombine=T) %do% 
  t[Group==grp&Detail>t[Group==grp,mean(Detail)],]
#        Group Detail
# 1:     1      4
# 2:     1      5
# 3:     2      9
# 4:     2     10
# 5:     3     14
# 6:     3     15
# 7:     4     19
# 8:     4     20
# 9:     5     24
#10:     5     25

问题是,是否可以使用 data.table 功能对最后两行进行简洁编码?抱歉,如果这是重复,我也在努力解释让 google/stackoverflow 找到它的确切目标。

【问题讨论】:

  • dt[, .SD[Detail > mean(Detail)], by = Group] 也许? (我已将t 重命名为dt,因为t 是R 中的一个函数)。您也可以使用indx <- dt[, .I[Detail > mean(Detail)], by = Group]$V1 ; dt[indx] 来获得一些性能
  • 谢谢大卫,是的,我并没有真正运行代码,只是为了一个例子而写的(t 作为转置)。我检查了你的答案,看起来不错。
  • 使用data.table v >=1.9.7,你也可以做一个非等连接,比如res <- dt[, mean(Detail), by = Group] ; dt[res, .(Group, x.Detail), on = .(Group, Detail > V1)]

标签: r key data.table aggregate subset


【解决方案1】:

使用 .SD 功能有效。不知道,谢谢:

dt[, .SD[Detail > mean(Detail)], by = Group] 

同样有效,但性能有所提升:

indx <- dt[, .I[Detail > mean(Detail)], by = Group]$V1 ; dt[indx]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2014-10-30
    • 1970-01-01
    • 2021-08-17
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多