【发布时间】:2018-03-16 12:54:28
【问题描述】:
当使用ddply 像这样返回一个汇总数据的数据框时:
new_data <- ddply(data, .(grp1, grp2), function(x){
val_list <- some_func(x.some_val)
data.frame(
val_1 = val_list[1],
val_2 = val_list[2],
val_3 = val_list[3]
)}, .drop=FALSE
)
.drop=FALSE 表示我得到grp1 和grp2 组合的行,即使data 中不存在这些组合。
当使用dt[,.(val1=some_func(some_val1, some_val2)), by='grp1,grp2'] 制作汇总表时,我正在寻找data.table 中的等效功能,因为这将排除不存在的组合。
编辑:更完整的例子
输入:
data = read.csv(text = "
grp1, grp2, some_var1, some_var2
a, x, 3, 1
a, y, 3, 2
a, y, 3, 2
b, x, 3, 2
b, y, 4, 2
b, y, 4, 1
c, x, 5, 1
c, y, 5, 2
c, z, 5, 2")
现在假设我想要每个组的 (some_var1 * some_var2) 的平均值以及每个 var 的总和。
如果我使用 ddply:
library(plyr)
new_data <- ddply(data, .(grp1, grp2), function(x){
data.frame(
val_1 = mean(x$some_var1 * x$some_var2),
val_2 = sum(x$some_var1),
val_3 = sum(x$some_var2)
)}, .drop=FALSE
)
输出:
grp1, grp2, val_1, val_2, val_3
a, x, 3, 3, 1
a, y, 6, 6, 4
a, z, NA, NA, NA
b, x, 6, 3, 2
b, y, 6, 8, 3
b, z, NA, NA, NA
c, x, 5, 5, 1
c, y, 10, 5, 2
c, z, 10, 5, 2
但使用data.table 时不会包含NA 行,因为原始数据没有grp1 和grp2 的组合。
显然,这是一个大大简化的示例,实际上我正在计算更多可能的组,使用三个分组变量,并返回三个以上的新简单汇总变量。
【问题讨论】:
-
我认为提供一个示例数据框和您想要的输出会很有用
-
@KenS。添加了更多示例
标签: r data.table