forma más rápida de crear una variable que agregue una columna por id [duplicado]
Esta pregunta ya tiene una respuesta aquí:
Calcular la media del grupo (u otras estadísticas de resumen) y asignar a los datos originales 4 respuestas¿Hay alguna forma más rápida de hacer esto? Supongo que esto es innecesariamente lento y que una tarea como esta se puede lograr con funciones básicas.
df <- ddply(df, "id", function(x) cbind(x, perc.total = sum(x$cand.perc)))
Soy bastante nuevo en R. He visto aby()
, aggregate()
ytapply()
, pero no conseguí que trabajaran en absoluto o como yo quería. En lugar de devolver un vector más corto, quiero adjuntar la suma al marco de datos original. ¿Cuál es la mejor manera de hacer esto
Edit: Aquí hay una comparación de velocidad de las respuestas aplicadas a mis datos.
> # 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