我想按组进行简单的计算。我经常使用aggregate
。要按组sum
,var
和gp1
计算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)]
我做错了什么?
答案 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