J'ai un df avec deux colonnes d'intérêt: Date et Qualité. La date est une série chronologique quotidienne. Il existe trois options pour la qualité: bonne, estimée, manquante. L'une de ces options étant associée à une date donnée.
Je voudrais récupérer deux informations: (1) est une liste d'étirements consécutifs qu'une option a sur la série chronologique; et (2) les dates associées à ces enregistrements consécutifs.
Par exemple,
1900-01-01 Good 1900-01-02 Good 1900-01-03 Good 1900-01-04 Estimated 1900-01-05 Good 1900-01-06 Good 1900-01-07 Estimated 1900-01-08 Good
Donc ici, pour de bon, nous aurions une liste consécutive de 3 , 2,1 et je voudrais renvoyer une liste de dates du 1900-01-01 au 1900-01-03, du 1900-01-05 au 1900-01-06 et du 1900-01-08 associée au 3,2, 1 liste.
3 Réponses :
Vous pouvez utiliser rle
Les sections ci-dessous montrent les longueurs consécutives pour Good
df <- read.table(text = "Date Quality
1900-01-01 Good
1900-01-02 Good
1900-01-03 Good
1900-01-04 Estimated
1900-01-05 Good
1900-01-06 Good
1900-01-07 Estimated
1900-01-08 Good", header = T, stringsAsFactors = F)
Obtenir les dates peut être fait directement à partir du df
encodes <- rle(df$Quality) encodes$lengths[encodes$values == "Good"] [1] 3 2 1
df <- fread('
Date Quality
1900-01-01 Good
1900-01-02 Good
1900-01-03 Good
1900-01-04 Estimated
1900-01-05 Good
1900-01-06 Good
1900-01-07 Estimated
1900-01-08 Good
')
df[, Date := as.Date(Date)]
Une possibilité dplyr pourrait être:
df %>%
mutate(rleid = with(rle(V2), rep(seq_along(lengths), lengths)),
V1 = as.Date(V1, format = "%Y-%m-%d")) %>%
group_by(rleid, V2) %>%
summarise(res = paste0(min(V1), ":", max(V1)),
n = n()) %>%
group_by(V2) %>%
mutate(rleid = seq_along(rleid)) %>%
arrange(V2, rleid)
rleid V2 res n
<int> <chr> <chr> <int>
1 1 Estimated 1900-01-04:1900-01-04 1
2 2 Estimated 1900-01-07:1900-01-07 1
3 1 Good 1900-01-01:1900-01-03 3
4 2 Good 1900-01-05:1900-01-06 2
5 3 Good 1900-01-08:1900-01-08 1
Ou:
df %>%
mutate(rleid = with(rle(V2), rep(seq_along(lengths), lengths)),
V1 = as.Date(V1, format = "%Y-%m-%d")) %>%
group_by(rleid, V2) %>%
summarise(res = paste0(min(V1), ":", max(V1))) %>%
group_by(V2) %>%
mutate(rleid = seq_along(rleid)) %>%
arrange(V2, rleid)
rleid V2 res
<int> <chr> <chr>
1 1 Estimated 1900-01-04:1900-01-04
2 2 Estimated 1900-01-07:1900-01-07
3 1 Good 1900-01-01:1900-01-03
4 2 Good 1900-01-05:1900-01-06
5 3 Good 1900-01-08:1900-01-08
Ou:
df %>%
mutate(rleid = with(rle(V2), rep(seq_along(lengths), lengths)),
V1 = as.Date(V1, format = "%Y-%m-%d")) %>%
group_by(rleid, V2) %>%
summarise(res = paste0(min(V1), ":", max(V1)))
rleid V2 res
<int> <chr> <chr>
1 1 Good 1900-01-01:1900-01-03
2 2 Estimated 1900-01-04:1900-01-04
3 3 Good 1900-01-05:1900-01-06
4 4 Estimated 1900-01-07:1900-01-07
5 5 Good 1900-01-08:1900-01-08