【问题标题】:R Data Aggregation With WHERE Clause on GroupR数据聚合与组上的WHERE子句
【发布时间】:2015-05-11 20:18:25
【问题描述】:

例如,我有如下所示的 data.table。我想做一个简单的聚合,其中 b=sum(b)。但是,对于 c,我想要 c 中记录的值,其中 b 是最大值。所需的输出如下所示(data.aggr)。这就引出了几个问题:

1) 有没有办法做这个data.table?

2) 在 plyr 中有更简单的方法吗?

3) 在 plyr 中,输出对象从 data.table 更改为 data.frame。我可以避免这种行为吗?

library(plyr)
library(data.table) 
dt <- data.table(a=c('a', 'a', 'a', 'b', 'b'), b=c(1, 2, 3, 4, 5), 
                 c=c('m', 'n', 'p', 'q', 'r'))
dt
#    a b c
# 1: a 1 m
# 2: a 2 n
# 3: a 3 p
# 4: b 4 q
# 5: b 5 r
dt.split <- split(dt, dt$a)
dt.aggr <- ldply(lapply(dt.split,  
    FUN=function(dt){ dt[, .(b=sum(b), c=dt[b==max(b), c]), 
    by=.(a)] }), .id='a')
dt.aggr
#   a b c
# 1 a 6 p
# 2 b 9 r
class(dt.aggr)
# [1] "data.frame"

【问题讨论】:

  • 为什么要在plyr 上使用plyr :-O?
  • 如果你的代码可以复制粘贴就好了——也就是说,每行的开头没有&gt;+
  • 阿伦——有了大卫的解决方案,我不再需要......

标签: r data.table plyr


【解决方案1】:

这是data.table范围内的一个简单操作

dt[, .(b = sum(b), c = c[which.max(b)]), by = a]
#    a b c
# 1: a 6 p
# 2: b 9 r

类似的选择是

dt[order(b), .(b = sum(b), c = c[.N]), by = a]

【讨论】:

  • 太好了,谢谢大卫。不知道which.max。你能澄清一下 c=c[] 符号吗?我在 data.table 文档中没有看到这一点。
  • 这是一个普通的子设置功能,就像你从基础 R 中知道的那样。c[which.max(b)] 表示“c 的值,其中b 是最大值”。 c = c[ 表示“创建一个名为 c 的新列,其中将包含该值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 2010-09-28
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多