2012-04-05 16 views
17

¿Hay alguna manera de contar el número de veces que aparece un objeto en una columna acumulativamente en R?Recuento acumulado en R

p. Ej. Decir que tengo la columna:

id 
1 
2 
3 
2 
2 
1 
2 
3 

esto se convertiría en:

id count 
1  1 
2  1 
3  1 
2  2 
2  3 
1  2 
2  4 
3  2 

etc ...

Gracias

Respuesta

21

La función ave calcula una función por grupo.

> id <- c(1,2,3,2,2,1,2,3) 
> data.frame(id,count=ave(id==id, id, FUN=cumsum)) 
    id count 
1 1  1 
2 2  1 
3 3  1 
4 2  2 
5 2  3 
6 1  2 
7 2  4 
8 3  2 

utilizo id==id para crear un vector de todos los TRUE valores, que son convertidas a numérico cuando se pasa a cumsum. Puede reemplazar id==id con rep(1,length(id)).

7

Aquí es una manera de conseguir los recuentos:

id <- c(1,2,3,2,2,1,2,3) 

sapply(1:length(id),function(i)sum(id[i]==id[1:i])) 

Qué te ofrece:

[1] 1 1 1 2 3 2 4 2 
+1

@ user1165199: si esto mejor respondió su pregunta, haga clic en la marca de verificación. –

+0

Esto es as. Atarlo en un objeto data.table también es simple. – DaveRGP

2

El marco de datos que tenía era demasiado grande y la respuesta aceptada seguía fallando. Esto funcionó para mí:

library(plyr) 
df$ones <- 1 
df <- ddply(df, .(id), transform, cumulative_count = cumsum(ones)) 
df$ones <- NULL