R-每组计算-data.table和aggregate()

时间:2019-04-12 16:45:28

标签: r data.table aggregate

我想按组进行简单的计算。我经常使用aggregate。要按组sumvargp1计算gp2的{​​{1}},我做了:

gp3

效果很好,但是非常慢。在数据表中进行操作之前,我想尝试更改函数的语法以加快处理过程。然后我做了:

m.temp  <- aggregate(var ~ gp1 + gp2 + gp3, df, sum)

不幸的是,对我来说,简单的验证显示这些计算是不等效的。

m.temp2 <- aggregate(df$var, 
                     list(df$gp1, df$gp2, df$gp3), 
                     sum)

变量名称不同,但更糟的是,这2个结果之间存在19 477个观测值(行)的差异,这并不是因为存在> identical(m.temp, m.temp2) [1] FALSE ...

然后是我的第一个问题:怎么来?这两种语法有什么区别?

要了解哪种语法是好的语法,我尝试使用简单的data.table进程来实现。不幸的是,由于语法不正确,我无法获得任何结果,但是我不明白自己错过了什么。我绑:

NAs

最后,我也尝试直接聚合一个新列,但没有结果...

m.temp4 <- df[, list(sum = sum(df$var)), 
                      by = list(gp1, gp2, gp3)]

我做错了什么?

1 个答案:

答案 0 :(得分:2)

假设数据集为data.table或使用setDT转换为一个数据集

library(data.table)
setDT(df)[, new_col := sum(var), by = .(gp1, gp2, gp3)]

在OP的帖子中,sum是在整个列df$var上完成的,而不是在组内的'var'元素上完成的,从而产生一个sum值。删除df$并使用未引用的列名。

注意::=创建一个新列。如果要概述,请将其放在list.()

setDT(df)[, .(new_col =  sum(var)), by = .(gp1, gp2, gp3)]

另一个选项是tidyverse

library(tidyverse)
df %>%
    group_by(gp1, gp2, gp3) %>%
    summarise(new_col = sum(var))

要创建新列,请将summarise替换为mutate