Je travaille avec un échantillon de données, qui est similaire à la structure ci-dessous:
df <- structure(list(ID = c(1, 1, 2, 2, 3, 3), Date = structure(c(15380, 15470, 17045, 17084, 16474, 16527), class = "Date"), Score = c(5, 5, 8, 5, 3, 3)), row.names = c(NA, -6L), class = "data.frame")
Je souhaite en quelque sorte le transformer en la forme suivante:
df$Date <- as.Date(df$Date,format="%d.%m.%Y") df %>% group_by(ID) %>% complete(seq.Date(min(Date), max(Date), by="months"))
3 Réponses :
Vous pouvez essayer
library(tidyverse) df %>% select(ID, Date, Score) %>% mutate(month = lubridate::month(Date)) %>% group_by(ID) %>% complete(month = full_seq(month,1), Score)
Votre dput ()
diffère de votre exemple.
Vous pouvez utiliser as.yearmon ()
de zoo
dans l'ordre pour le format, plus na.locf ()
pour combler les lacunes.
library(dplyr) library(zoo) df %>% group_by(ID) %>% complete(Date = seq.Date(min(Date), max(Date), by = "months")) %>% ungroup() %>% mutate(Date = as.yearmon(Date)) %>% mutate(Score = na.locf(Score, na.rm=T), type = na.locf(type, na.rm=T)) # # A tibble: 9 x 4 # ID Date type Score # <dbl> <S3: yearmon> <chr> <dbl> # 1 1 feb 2012 a 5 # 2 1 mar 2012 a 5 # 3 1 apr 2012 a 5 # 4 1 mag 2012 b 5 # 5 2 set 2016 a 8 # 6 2 ott 2016 a 8 # 7 2 nov 2016 a 8 # 8 2 dic 2016 a 8 # 9 3 feb 2015 a 3
Vous pouvez utiliser le fill
de tidyr
.
## A tibble: 9 x 3 # ID Date Score # <dbl> <chr> <dbl> #1 1 02.2012 5 #2 1 03.2012 5 #3 1 04.2012 5 #4 1 05.2012 5 #5 2 09.2016 8 #6 2 10.2016 8 #7 3 02.2015 3 #8 3 03.2015 3 #9 3 04.2015 3
ce qui vous mène:
library(tidyverse) df %>% group_by(ID) %>% complete(Date = seq.Date(min(Date), max(Date + 10), by="months")) %>% ungroup() %>% fill(Score) %>% mutate(Date = gsub("-", ".", format(as.Date(Date), "%m-%Y")))
Juste une faute de frappe. Vous devez définir
Date = date suivante (...)
, c'est-à-dire... complete (Date = date date (min (date), max (date), par = ") mois "))
La colonne
Date
doit conserver la classeDate
?