我有下面提到的数据框:
Date Val1 Val2
2018-04-01 125 0.05
2018-04-03 458 2.99
2018-04-05 354 1.25
我想在数据框中考虑Sys.Date()
(此处为Sys.Date()
为2018-04-06),仅添加缺少的日期,相应的val1和val2为0。
我尝试过:t2<-merge(data.frame(Date= seq(min(ymd(t1$Date)), max(ymd(date)), by = "days")), t1, by = "Date", all = TRUE)
必填数据框:
Date Val1 Val2
2018-04-01 125 0.05
2018-04-02 0 0
2018-04-03 458 2.99
2018-04-04 0 0
2018-04-05 354 1.25
2018-04-06 0 0
答案 0 :(得分:4)
可以使用library(tidyverse)
df1 %>%
complete(Date = seq(Date[1], Sys.Date(), by = "1 day"),
fill = list(Val1 = 0, Val2 = 0))
fill
如果我们需要为fill
传递多个变量,请创建nm1 <- setdiff(names(df1), "Date") #in this example excluding the Date
nm2 <- setNames(as.list(rep(0, length(nm1))), nm1)
所需的列列表
fill
然后将其作为df1 %>%
complete(Date = seq(Date[1], Sys.Date(), by = "1 day"), fill = nm2)
# A tibble: 35 x 3
# Date Val1 Val2
# <date> <dbl> <dbl>
# 1 2018-04-01 125 0.05
# 2 2018-04-02 0 0
# 3 2018-04-03 458 2.99
# 4 2018-04-04 0 0
# 5 2018-04-05 354 1.25
# 6 2018-04-06 0 0
# 7 2018-04-07 0 0
# 8 2018-04-08 0 0
# 9 2018-04-09 0 0
#10 2018-04-10 0 0
# ... with 25 more rows
viewpager.getCurrentItem()
答案 1 :(得分:3)
您可以使用padr
。 padr
用于填写缺少的日期值。
首先,根据间隔添加缺失日期,如果您不想要NA,则用一个值(或最大值的函数)填充它们
编辑:添加end_val以包括运行直到sys.Date()
library(padr)
# Specify end_val to go all the way to sys.Date and add 1 to include sys.Date
padded_df <- pad(df, interval = "day", end_val = Sys.Date()+1)
padded_df <- fill_by_value(padded_df, value = 0)
padded_df
Date Val1 Val2
1 2018-04-01 125 0.05
2 2018-04-02 0 0.00
3 2018-04-03 458 2.99
4 2018-04-04 0 0.00
5 2018-04-05 354 1.25
.....
31 2018-05-01 0 0
32 2018-05-02 0 0
33 2018-05-03 0 0
34 2018-05-04 0 0
35 2018-05-05 0 0
36 2018-05-06 0 0
答案 2 :(得分:2)
这是对你的方法的修正,基础R。
在您的真实应用中将max(t1$Date)
替换为Sys.Date()
:
t2<-merge(data.frame(Date= as.Date(min(t1$Date):max(t1$Date),"1970-1-1")),
t1, by = "Date", all = TRUE)
t2[is.na(t2)] <- 0
# Date Val1 Val2
# 1 2018-04-01 125 0.05
# 2 2018-04-02 0 0.00
# 3 2018-04-03 458 2.99
# 4 2018-04-04 0 0.00
# 5 2018-04-05 354 1.25
数据强>
t1 <- read.table(text="Date Val1 Val2
'2018-04-01' 125 0.05
'2018-04-03' 458 2.99
'2018-04-05' 354 1.25",h=T,strin=F)
t1$Date <- as.Date(df$Date)