Créer un compteur d’identifiants

March 1, 2010
By

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.

Tags:

Comments are closed.