J'ai une question très basique avec laquelle je me débat un peu, J'ai un grand ensemble de données de panel qui ressemble à ceci:
library(dplyr) df <- df %>% group_by(id) %>% mutate(count=)
Je voudrais trouver un moyen compact de compter combien de fois ma variable x change pour chaque identifiant. L'ensemble de données final devrait ressembler à quelque chose comme ceci
df <- data.frame(id= c(1,1,1,2,2,2,3,3,3,4,4,4), time=c(1,2,3,1,2,3,1,2,3,1,2,3), x = c(0,0,0,0,1,1,0,0,1,0,1,2),count= c(0,0,0,1,1,1,1,1,1,2,2,2))
Idéalement, j'aimerais utiliser dplyr
Je pensais que je devrais faire quelque chose comme
df <- data.frame(id= c(1,1,1,2,2,2,3,3,3,4,4,4), time=c(1,2,3,1,2,3,1,2,3,1,2,3), x = c(0,0,0,0,1,1,0,0,1,0,1,2))
Mais je ne sais pas comment le compléter car je ne sais pas quel type de commande je peux utiliser pour compter les changements de scores.
Merci beaucoup pour avancer pour votre aide
3 Réponses :
En utilisant dplyr
, voici une façon d'utiliser lag
df %>% group_by(id) %>% mutate(count = length(unique(data.table::rleid(x))) - 1)
qui devient un peu plus courte avec data.table :: rleid
library(dplyr) df %>% group_by(id) %>% mutate(count = length(unique(cumsum(x != lag(x, default = first(x))))) - 1) # id time x count # <dbl> <dbl> <dbl> <dbl> # 1 1 1 0 0 # 2 1 2 0 0 # 3 1 3 0 0 # 4 2 1 0 1 # 5 2 2 1 1 # 6 2 3 1 1 # 7 3 1 0 1 # 8 3 2 0 1 # 9 3 3 1 1 #10 4 1 0 2 #11 4 2 1 2 #12 4 3 2 2
Vous pouvez utiliser la somme de la différence décalée de x différente de zéro:
library(dplyr) df %>% group_by(id) %>% mutate(count = sum(diff(x) != 0)) id time x count 1 1 1 0 0 2 1 2 0 0 3 1 3 0 0 4 2 1 0 1 5 2 2 1 1 6 2 3 1 1 7 3 1 0 1 8 3 2 0 1 9 3 3 1 1 10 4 1 0 2 11 4 2 1 2 12 4 3 2 2
Nous pouvons utiliser rle
avec n_distinct
library(data.table) setDT(df)[, count := uniqueN(rleid(x)) - 1, id]
Ou avec data.table
library(dplyr) df %>% group_by(id) %>% mutate(count = n_distinct(rle(x)$values)-1) # A tibble: 12 x 4 # Groups: id [4] # id time x count # <dbl> <dbl> <dbl> <dbl> # 1 1 1 0 0 # 2 1 2 0 0 # 3 1 3 0 0 # 4 2 1 0 1 # 5 2 2 1 1 # 6 2 3 1 1 # 7 3 1 0 1 # 8 3 2 0 1 # 9 3 3 1 1 #10 4 1 0 2 #11 4 2 1 2 #12 4 3 2 2