maneira mais rápida de criar variável que agrega uma coluna por ID [duplicado]
Esta pergunta já tem uma resposta aqui:
Calcular a média do grupo (ou outras estatísticas de resumo) e atribuir aos dados originais 4 respostasExiste uma maneira mais rápida de fazer isso? Eu acho que isso é desnecessariamente lento e que uma tarefa como essa pode ser realizada com as funções básica
df <- ddply(df, "id", function(x) cbind(x, perc.total = sum(x$cand.perc)))
Eu sou muito novo em R. Eu olhei paraby()
, aggregate()
etapply()
, mas não os levou a trabalhar de maneira alguma ou da maneira que eu queria. Em vez de retornar um vetor mais curto, quero anexar a soma ao quadro de dados original. Qual é a melhor maneira de fazer isso?
Edit: Aqui está uma comparação rápida das respostas aplicadas aos meus dado
> # 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