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 № 1Tu 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 dplyr
ici, 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)