J'ai identifié, si je ne l'ai pas moi-même créé, un bogue difficile à résoudre dans un bon code reçu d'un généreux répondant ici sur StackOverflow il y a quelques semaines pourrait utiliser une nouvelle aide aujourd'hui.Regroupement d'une trame de données par date: résoudre le bug des périodes manquantes
données d'échantillon (appelé objet eh
ci-dessous):
ID 2013-03-20 2013-04-09 2013-04-11 2013-04-17 2013-04-25 2013-05-15 2013-05-24 2013-05-25 2013-05-26
5167f 0 0 0 0 0 0 0 0 0
1214m 0 0 0 0 0 0 0 0 0
1844f 0 0 0 0 0 0 0 0 0
2113m 0 0 0 0 0 0 0 0 0
2254m 0 0 0 0 0 0 0 0 0
2721f 0 0 0 0 0 0 0 0 0
3121f 0 0 0 0 0 0 0 0 0
3486f 0 0 0 0 0 0 0 0 0
3540f 0 0 0 0 0 0 0 0 0
4175m 0 0 0 0 0 0 0 0 0
Je dois être en mesure de groupe 0s
et 1s
par la période dans laquelle la date de leur colonne respective tombe (par exemple, tous les 1, 2, 3 , ou 4 semaines). Chaque fois qu'un 1
tombe au moins une fois dans une plage de dates spécifique (Period
), alors un 1
est résumé pour ce ID
dans ce Period
(0
, else). Je commence par la routine récapitulative d'une semaine à titre d'exemple. Mon principal problème est que la sortie finale générée manque une partie du total possible 1-semaine Periods
au cours de la série chronologique "2013-03-20"
à "2015-12-31"
.
Avis dans cette sortie par exemple, dans lequel les lignes sont pour uniques IDs
et les colonnes sont pour Periods
uniques, comment Periods
2, 5, 7 et 9 sont portés disparus:
1 3 4 6 8 10 11 12 13 14
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
Voici la routine complète pour grouper la trame de données d'origine (voir les données ci-dessus) échantillons partagés:
#Convert to data table from original data frame, eh
dt <- as.data.table(eh)
#One week summarized encounter histories
dt_merge <- data_frame(
# Create a column showing the beginning date
Date1 = seq(from = ymd("2013-03-20"), to = ymd("2015-12-31"), by = "1 week")) %>%
# Create a column showing the end date of each period
mutate(Date2 = lead(Date1)) %>%
# Adjust Date1
mutate(Date1 = if_else(Date1 == ymd("2013-03-20"), Date1, Date1 + 1)) %>%
# Remove the last row
drop_na(Date2) %>%
# Create date list
mutate(Dates = map2(Date1, Date2, function(x, y){ seq(x, y, by = "day") })) %>%
unnest() %>%
# Create Group ID
mutate(RunID = group_indices_(., dots. = c("Date1", "Date2"))) %>%
# Create Period ID
mutate(Period = paste0(RunID)) %>%
# Add a column showing Month
mutate(Month = month(Dates)) %>%
# Add a column showing Year
mutate(Year = year(Dates)) %>%
# Add a column showing season
mutate(Season = case_when(
Month %in% 3:5 ~ "Spring",
Month %in% 6:8 ~ "Summer",
Month %in% 9:11 ~ "Fall",
Month %in% c(12, 1, 2) ~ "Winter",
TRUE ~ NA_character_
)) %>%
# Combine Season and Year
mutate(SeasonYear = paste0(Season, Year)) %>%
select(-Date1, -Date2, -RunID)
dt2 <- dt %>%
# Reshape the data frame
gather(Date, Value, -ID) %>%
# Convert Date to date class
mutate(Date = ymd(Date)) %>%
# Join dt_merge
left_join(dt_merge, by = c("Date" = "Dates"))
one.week <- dt2 %>%
group_by(ID, Period) %>%
summarise(Value = max(Value)) %>%
spread(Period, Value)
#Finished product
one.week <- as.data.frame(one.week)
#Missing weeks 2, 5, 7, and 9...
one.week
quelqu'un peut-il me aider à comprendre où je suis allé mal? Merci d'avance!
-AD
C'est ça. Merci beaucoup! – Andrew