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
Datedoit conserver la classeDate?