/ / comment compter les répétitions de la première valeur survenue avec dplyr - r, dplyr

comment compter les répétitions de la première valeur avec dplyr - r, dplyr

J'ai une base de données avec des groupes qui ressemble essentiellement à ceci

DF <- data.frame(state = c(rep("A", 3), rep("B",2), rep("A",2)))

DF
state
1     A
2     A
3     A
4     B
5     B
6     A
7     A

Ma question est de savoir comment compter le nombre de consécutif lignes où la première valeur est répétée dans son premier "bloc". Donc pour DF ci-dessus, le résultat devrait être 3. La première valeur peut apparaître autant de fois que nécessaire, avec d'autres valeurs entre elles, ou il peut s'agir de la seule valeur apparaissant. La tentative naïve suivante échoue en général, car elle compte tout occurrences de la première valeur.

DF %>% mutate(is_first = as.integer(state == first(state))) %>%
summarize(count = sum(is_first))

Le résultat dans ce cas est 5. Donc, des astuces sur un (de préférence) dplyr une solution à cela serait appréciée.

Réponses:

1 pour la réponse № 1

Tu peux essayer:

rle(as.character(DF$state))$lengths[1]
[1] 3

Dans ton dplyr chaîne qui serait juste:

DF %>% summarize(count_first = rle(as.character(state))$lengths[1])

#   count_first
# 1           3

Ou être trop zélé avec la tuyauterie, en utilisant dplyr et magrittr:

library(dplyr)
library(magrittr)
DF %>% summarize(count_first = state %>%
as.character %>%
rle %$%
lengths %>%
first)

#   count_first
# 1           3

Fonctionne également pour les données groupées:

DF <- data.frame(group = c(rep(1,4),rep(2,3)),state = c(rep("A", 3), rep("B",2), rep("A",2)))

#   group state
# 1     1     A
# 2     1     A
# 3     1     A
# 4     1     B
# 5     2     B
# 6     2     A
# 7     2     A

DF %>% group_by(group) %>% summarize(count_first = rle(as.character(state))$lengths[1])

# # A tibble: 2 x 2
#    group count_first
#    <dbl>       <int>
#  1     1           3
#  2     2           1

1 pour la réponse № 2

Pas besoin de dplyrici, mais vous pouvez modifier cet exemple pour l'utiliser avec dplyr. La clé est la fonction rle

state = c(rep("A", 3), rep("B",2), rep("A",2))

x = rle(state)
DF = data.frame(len = x$lengths, state = x$values)
DF

# get the longest run of consecutive "A"
max(DF[DF$state == "A",]$len)