gpt4 book ai didi

performance - 创建按 id 聚合列的变量的更快方法

转载 作者:行者123 更新时间:2023-12-04 13:08:46 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Calculate group mean (or other summary stats) and assign to original data

(4 个回答)


4年前关闭。




有没有更快的方法来做到这一点?我想这是不必要的缓慢,并且可以使用基本函数完成这样的任务。

df <- ddply(df, "id", function(x) cbind(x, perc.total = sum(x$cand.perc)))

我对 R 很陌生。我看过 by() , aggregate()tapply() ,但根本没有让它们工作或以我想要的方式工作。我不想返回较短的向量,而是想将总和附加到原始数据帧。做这个的最好方式是什么?

编辑:这是应用于我的数据的答案的速度比较。
> # My original solution
> system.time( ddply(df, "id", function(x) cbind(x, perc.total = sum(x$cand.perc))) )
user system elapsed
14.405 0.000 14.479

> # Paul Hiemstra
> system.time( ddply(df, "id", transform, perc.total = sum(cand.perc)) )
user system elapsed
15.973 0.000 15.992

> # Richie Cotton
> system.time( with(df, tapply(df$cand.perc, df$id, sum))[df$id] )
user system elapsed
0.048 0.000 0.048

> # John
> system.time( with(df, ave(cand.perc, id, FUN = sum)) )
user system elapsed
0.032 0.000 0.030

> # Christoph_J
> system.time( df[ , list(perc.total = sum(cand.perc)), by="id"][df])
user system elapsed
0.028 0.000 0.028

最佳答案

由于您是 R 的新手,而且速度显然对您来说是个问题,我推荐 data.table包,这真的很快。在一行中解决您的问题的一种方法如下:

library(data.table)
DT <- data.table(ID = rep(c(1:3), each=3),
cand.perc = 1:9,
key="ID")
DT <- DT[ , perc.total := sum(cand.perc), by = ID]
DT
ID Perc.total cand.perc
[1,] 1 6 1
[2,] 1 6 2
[3,] 1 6 3
[4,] 2 15 4
[5,] 2 15 5
[6,] 2 15 6
[7,] 3 24 7
[8,] 3 24 8
[9,] 3 24 9

免责声明:我不是 data.table 专家(还不是 ;-),所以可能有更快的方法来做到这一点。如果您有兴趣使用该软件包,请查看软件包站点以帮助您入门: http://datatable.r-forge.r-project.org/

关于performance - 创建按 id 聚合列的变量的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8225621/

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