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)
3 Réponses :
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)))
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))
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