【发布时间】:2012-01-03 18:24:35
【问题描述】:
有没有更快的方法来做到这一点?我想这是不必要的慢,像这样的任务可以通过基本函数来完成。
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
【问题讨论】:
-
我想知道这会做什么(可能只是暗中一枪):
aggregate(cand.perc ~ id, data = df, FUN = sum)?或者你可以做tapply(df$cand.perc, INDEX = df$id, FUN = sum)。有关 apply 系列函数的进一步使用,请参阅stackoverflow.com/questions/3505701/… -
@RomanLuštrik 这些将是原始数据的较低维度,但您可以使用
merge来获得 OP 想要的这些 -
我不知何故错过了“攻击原始df的总和”。谢谢!
-
好的,很难准确地说出你想要什么。如果您进行任何类型的聚合,您将使新向量更短。所以,我猜你要的是两件事之一。一个可能是每一行的总和,附加它。另一个可能是您希望通过 id 获取聚合但保持复制,以便它仍然是作为 df 中的新列的适当长度。这些中的任何一个都正确吗?请澄清问题,以便有人知道。
-
我正在尝试做后者。 Aggregate() 或 by() 返回长度较短的向量,但我希望按 id 列出每个观察值的总和。
标签: performance r aggregate plyr