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()
fromzoo
中的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
类?