R 填充缺少的月份并向前填充

R 填充缺少的月份并向前填充,r,dplyr,R,Dplyr,我使用的是一个数据示例,其结构类似于下面的结构: ID Date Score 1 10.02.2012 5 1 10.05.2012 5 2 01.09.2016 8 2 10.10.2016 8 3 08.02.2015 3 3 02.04.2015 3 我希望以某种方式将ist转换为以下形式: ID Date Score 1 02.2012

我使用的是一个数据示例,其结构类似于下面的结构:

  ID Date           Score
  1  10.02.2012     5
  1  10.05.2012     5
  2  01.09.2016     8
  2  10.10.2016     8
  3  08.02.2015     3
  3  02.04.2015     3
我希望以某种方式将ist转换为以下形式:

  ID     Date        Score
  1      02.2012     5
  1      03.2012     5
  1      04.2012     5
  1      05.2012     5
  2      09.2016     8
  2      10.2016     8
  3      02.2015     3
  3      03.2015     3
  3      04.2015     3 
首先,我通过执行以下命令将字符日期转换为日期格式:

df$Date <- as.Date(df$Date,format="%d.%m.%Y")
df %>% group_by(ID) %>% complete(seq.Date(min(Date), max(Date), by="months"))
df$Date%group_by(ID)%%>%完成(序号日期(最短(日期),最长(日期),by=“月”))
不幸的是,这对我不起作用。如果您有任何解决问题的想法,我们将不胜感激

要复制案例,请使用以下数据:

    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")
df你可以试试

library(tidyverse)
df %>% 
  select(ID, Date, Score) %>% 
  mutate(month = lubridate::month(Date)) %>% 
  group_by(ID) %>% 
  complete(month = full_seq(month,1), Score)
您的
dput()
与您的示例不同

您可以使用
as.yearmon()
from
zoo
中的
as.yearmon()
作为格式,再加上
na.locf()
来填充缺失

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
库(dplyr)
图书馆(动物园)
df%>%
分组依据(ID)%>%
完成(日期=连续日期(最短(日期),最长(日期),按=“月”))%>%
解组()%>%
突变(日期=as.yearmon(日期))%>%
变异(分数=na.locf(分数,na.rm=T),
类型=na.locf(类型,na.rm=T))
##tibble:9 x 4
#ID日期类型分数
#    
#2012年2月1日a 5
#2 2012年3月1日a 5
#3 2012年4月1日a 5
#4 1 mag 2012 b 5
#5 2套2016 a 8
#6 2 ott 2016 a 8
#7 2016年11月2日a 8
#8 2 dic 2016 a 8
#9 2015年2月3日a 3

您可以使用
tidyr
填充

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")))
什么导致你:

## 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
##一个tible:9 x 3
#身份证日期分数
#      
#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

只是一个打字错误。您需要定义
Date=seq.Date(…)
,即
完成(Date=seq.Date(min(Date),max(Date),by=“months”)
Date
列应该保留
Date
类?