gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:58:32 26 4
gpt4 key购买 nike

我想按组进行简单的计算。我经常使用 aggregate。按组 gp1gp2gp3 计算我的 varsum我做了:

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

它运行良好,但速度非常慢。在数据表中执行之前,我想尝试更改函数的语法以加快该过程。然后我做了:

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

对我来说不幸的是,一个简单的验证告诉我这些计算是不等价的。

> identical(m.temp, m.temp2)
[1] FALSE

变量名称不同,但更糟糕的是,这 2 个结果之间存在 19 477 个观察值(行)的差异,这不是因为某些 NA 存在...

那么我的第一个问题是:怎么会这样?这两种语法有什么区别?

为了了解哪种语法最好,我尝试使用简单的 data.table 过程来完成。不幸的是,由于我的语法不正确,我无法得到任何结果,但我不明白我错过了什么。我绑:

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

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

df[, new.col := sum(var), by = list(gp1, gp2, gp3)] 

我做错了什么?

最佳答案

假设数据集是 data.table 或者用 setDT 转换成一个

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

在 OP 的帖子中,sum 是在整个列 df$var 上完成的,而不是组内的“var”元素,结果是单个 总和 值。删除 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

关于R - 每组计算 - data.table 和 aggregate(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55656263/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com