| This post was kindly contributed by Alea - R - go there to comment and to read the full post. |
Si on a le data frame suivant :
id type 10002 "7" 10061 "1" 10061 "1" 10061 "4" 10065 "7" 10114 "1" 10114 "1" 10114 "4" 10136 "7" 10136 "2" 10136 "2"
Et qu'on veut obtenir ceci :
id type counter 10002 "7" 1 10061 "1" 1 10061 "1" 2 10061 "4" 3 10065 "7" 1 10114 "1" 1 10114 "1" 2 10114 "4" 3 10136 "7" 1 10136 "2" 2 10136 "2" 3
Avant toutes chose il faut ordonner le data frame selon la variable id :
df <- df[order(df$id),]
On peut utiliser la méthode suivante, mais qui est très lente :
df$count <- unlist(tapply(df$id, df$id, order))
On peut également utiliser la fonction table, c'est plus rapide :
df$count <- unlist(lapply(table(df$id), function(x){1:x}))
Mais le plus rapide est de passer par la fonction lre :
df$count <- unlist(lapply(rle(as.vector(df$id))$lengths,function(x){1:x})))
Comparaison des temps d'exécution des trois méthodes :
R> system.time(unlist(tapply(tmp$ident, tmp$ident, order)))
utilisateur système écoulé
4.196 0.000 4.840
R> system.time(unlist(lapply(table(tmp$ident),function(x){1:x})))
utilisateur système écoulé
0.028 0.000 0.033
R> system.time(unlist(lapply(rle(as.vector(tmp$ident))$lengths,function(x){1:x})))
utilisateur système écoulé
0.012 0.000 0.018
Fonctions rapides fournies par spacedman sur #R.