如何在R数据帧中没有该日期的行时根据系统日期添加Row

问题描述 投票:0回答:2

我有一个看起来像的数据框

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
r dataframe ggplot2 dplyr tidyr
2个回答
1
投票

使用complete包中的函数的另一种解决方案。 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)

2
投票

我们可以尝试completetidyr

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
© www.soinside.com 2019 - 2024. All rights reserved.