【问题标题】:Insert row to fill in missing date in R [duplicate]插入行以填写R中缺少的日期[重复]
【发布时间】:2019-12-31 04:06:25
【问题描述】:

我有一个如下所示的数据集:

Person   date     Amount
A       2019-01     900
A       2019-03     600
A       2019-04     300
A       2019-05       0
B       2019-04    1200
B       2019-07     800
B       2019-08     400
B       2019-09       0

您会在“日期”列中注意到,缺少日期,例如人 A 的“2019-02”和 B 的“2019-05”和“2019-06”。我想插入缺失日期和金额等于其前一行的行(请参阅下面的预期结果)。

我尝试过执行 group by,但我不知道如何从那里开始。我还尝试将“日期”和“金额”列转换为列表,并从那里填补空白,然后再将它们放回数据框。我想知道是否有更方便的方法来做到这一点。特别是,无需从原始数据框中提取列表即可获得相同的结果。

理想情况下,我希望有一个看起来像这样的数据框:

Person   date     Amount
A       2019-01     900
A       2019-02     900
A       2019-03     600
A       2019-04     300
A       2019-05       0
B       2019-04    1200
B       2019-05    1200
B       2019-06    1200
B       2019-07     800
B       2019-08     400
B       2019-09       0

我希望我能把我的问题说清楚。 提前致谢。

【问题讨论】:

    标签: r date dataframe append


    【解决方案1】:

    我们可以首先将日期转换为实际日期对象 (date1),方法是在末尾粘贴 "-01",然后使用 complete 为每个 Person 创建一系列 1 个月的日期对象。然后我们使用fill 使Amount 等于它之前的值,并以原始形式获取数据,我们再次从date1 中删除"-01"

    library(dplyr)
    library(tidyr)
    
    df %>%
      mutate(date1 = as.Date(paste0(date, "-01"))) %>%
      group_by(Person) %>%
      complete(date1 = seq(min(date1), max(date1), by = "1 month")) %>%
      fill(Amount) %>%
      mutate(date = sub("-01$", "", date1)) %>%
      select(-date1)
    
    #  Person date    Amount
    #  <fct>  <chr>    <int>
    # 1 A      2019-01    900
    # 2 A      2019-02    900
    # 3 A      2019-03    600
    # 4 A      2019-04    300
    # 5 A      2019-05      0
    # 6 B      2019-04   1200
    # 7 B      2019-05   1200
    # 8 B      2019-06   1200
    # 9 B      2019-07    800
    #10 B      2019-08    400
    #11 B      2019-09      0
    

    数据

    df <- structure(list(Person = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
    2L), .Label = c("A", "B"), class = "factor"), date = structure(c(1L, 
    2L, 3L, 4L, 3L, 5L, 6L, 7L), .Label = c("2019-01", "2019-03", 
    "2019-04", "2019-05", "2019-07", "2019-08", "2019-09"), class = "factor"), 
    Amount = c(900L, 600L, 300L, 0L, 1200L, 800L, 400L, 0L)), 
    class = "data.frame", row.names = c(NA, -8L))
    

    【讨论】:

      猜你喜欢
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多