我有一个看起来像的数据框
Date Value1 Value2 Value3 Value4
2018-02-10 1 2 4 3
2018-02-09 2 4 1 2
2018-02-08 3 1 1 3
考虑到今天为2018-02-13,如何在上述数据框中为2018-02-11和2018-02-12添加两行,在所有字段中均为0值。
输出DF:
Date Value1 Value2 Value3 Value4
2018-02-12 0 0 0 0
2018-02-11 0 0 0 0
2018-02-10 1 2 4 3
2018-02-09 2 4 1 2
2018-02-08 3 1 1 3
使用complete
包中的tidyr函数的另一种解决方案。 full_seq
函数可以方便地创建完整的日期列表。 dat2[is.na(dat2)] <- 0
将所有NA
替换为0。
library(tidyverse)
library(lubridate)
dat2 <- dat %>%
mutate(Date = ymd(Date)) %>%
complete(Date = full_seq(c(Date, ymd("2018-02-12")), period = 1)) %>%
arrange(desc(Date)) %>%
as.data.frame()
dat2[is.na(dat2)] <- 0
dat2
# Date Value1 Value2 Value3 Value4
# 1 2018-02-12 0 0 0 0
# 2 2018-02-11 0 0 0 0
# 3 2018-02-10 1 2 4 3
# 4 2018-02-09 2 4 1 2
# 5 2018-02-08 3 1 1 3
数据
dat <- read.table(text = "Date Value1 Value2 Value3 Value4
'2018-02-10' 1 2 4 3
'2018-02-09' 2 4 1 2
'2018-02-08' 3 1 1 3",
header = TRUE, stringsAsFactors = FALSE)
我们可以尝试complete
的tidyr
library(tidyverse)
l1 <- setNames(as.list(rep(0, 4)), names(df1)[-1])
complete(df1, Date = seq(as.Date("2018-02-12"), min(Date),
by = "-1 day"),
fill = l1) %>%
arrange(desc(Date))
# A tibble: 5 x 5
# Date Value1 Value2 Value3 Value4
# <date> <dbl> <dbl> <dbl> <dbl>
#1 2018-02-12 0 0 0 0
#2 2018-02-11 0 0 0 0
#3 2018-02-10 1.00 2.00 4.00 3.00
#4 2018-02-09 2.00 4.00 1.00 2.00
#5 2018-02-08 3.00 1.00 1.00 3.00