1
votes

Remplir les mois manquants avant le remplissage

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"))


2 commentaires

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 classe Date ?


3 Réponses :


0
votes

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)


0 commentaires

1
votes

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


0 commentaires

1
votes

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")))


0 commentaires