R 数据聚合与组上的 WHERE 子句
R Data Aggregation With WHERE Clause on Group
例如,我有如下所示的 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"
这是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]
例如,我有如下所示的 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"
这是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]