1
votes

compter le nombre de fois qu'une variable change de score par groupe

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


0 commentaires

3 Réponses :


0
votes

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


0 commentaires

2
votes

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


0 commentaires

0
votes

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


0 commentaires