【问题标题】:How to add Row according to system date when there is no row for that date in R dataframe当R数据框中没有该日期的行时,如何根据系统日期添加行
【发布时间】:2018-08-12 15:55:20
【问题描述】:

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

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 年 2 月 13 日,我怎样才能在上面的数据框中添加两行 2018 年 2 月 11 日和 2018 年 2 月 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


    【解决方案1】:

    我们可以试试complete from 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
    

    【讨论】:

    • 这五行只是例如我想传递包含〜500行的完整数据框。
    • @Rahulshah 如果您注意到代码,我将您感兴趣的日期顺序与“日期”的最小日期(假设它是 Date 类)一起使用。所以无论是 100 行还是 500 行,它都应该工作
    【解决方案2】:

    使用 包中的complete 函数的另一种解决方案。 full_seq 函数可以方便地创建完整的日期列表。 dat2[is.na(dat2)] &lt;- 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)
    

    【讨论】:

      猜你喜欢
      • 2014-12-07
      • 2021-12-16
      • 2018-12-06
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 2017-08-09
      • 2017-11-03
      • 2019-09-14
      相关资源
      最近更新 更多