3
votes

R: compter les occurrences consécutives de valeurs dans une seule colonne et par groupe

J'essaie de créer un nombre séquentiel de valeurs égales, un nombre d'occurrences. Cependant, je souhaite que le décompte soit réinitialisé une fois qu'un nouvel identifiant est introduit, même si la ligne reste séquentielle.

Exemple de ce à quoi mes données ressemblent:

c(1,2,1,2,3,1,2,3,4,5,1,2,3,4)

Donc je souhaite créer une nouvelle colonne avec les résultats dans:

dataset$Counter <- sequence(rle(as.character(dataset$YesNo))$lengths)

J'ai utilisé ce code que j'ai trouvé sur ce forum:

c(1,2,1,2,3,1,2,1,2,3,1,2,3,4)


0 commentaires

3 Réponses :


0
votes

Vous pouvez faire:

   ID YesNO Counter
1   a     1       1
2   a     1       2
3   a     0       1
4   a     0       2
5   a     0       3
6   a     1       1
7   a     1       2
8   b     1       1
9   b     1       2
10  b     1       3
11  b     0       1
12  b     0       2
13  b     0       3
14  b     0       4

Sortie:

dataset$Counter <- with(dataset,
                        ave(YesNO, ID, FUN = function(x) sequence(rle(as.character(x))$lengths)))


0 commentaires

3
votes

Utilisez rleid (du package data.table) pour obtenir une variable de regroupement, puis utilisez ave pour appliquer seq_along dans les valeurs communes de ce groupement:

   ID YesNO Counter
1   a     1       1
2   a     1       2
3   a     0       1
4   a     0       2
5   a     0       3
6   a     1       1
7   a     1       2
8   b     1       1
9   b     1       2
10  b     1       3
11  b     0       1
12  b     0       2
13  b     0       3
14  b     0       4

donnant:

library(data.table)
transform(dataset, Counter = ave(YesNO, rleid(ID, YesNO), FUN = seq_along))


0 commentaires

1
votes

Egalement une possibilité dplyr :

dataset %>%
 group_by(ID, grp = with(rle(YesNO), rep(seq_along(lengths), lengths))) %>%
 mutate(Counter = 1:n()) %>%
 ungroup() %>%
 select(-grp)

Ou:

dataset %>%
 group_by(ID, grp = with(rle(YesNO), rep(seq_along(lengths), lengths))) %>%
 mutate(Counter = seq_along(grp)) %>%
 ungroup() %>%
 select(-grp)

   ID    YesNO Counter
   <fct> <dbl>   <int>
 1 a        1.       1
 2 a        1.       2
 3 a        0.       1
 4 a        0.       2
 5 a        0.       3
 6 a        1.       1
 7 a        1.       2
 8 b        1.       1
 9 b        1.       2
10 b        1.       3
11 b        0.       1
12 b        0.       2
13 b        0.       3
14 b        0.       4


0 commentaires