быстрый способ создания переменной, которая агрегирует столбец по id [duplicate]

На этот вопрос уже есть ответ:

Рассчитать среднее по группе (или другую сводную статистику) и присвоить исходным данным 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 

Ответы на вопрос(6)

Ваш ответ на вопрос