首页 > 解决方案 > 插入行以填写 R 中缺少的日期

问题描述

我有一个看起来像这样的数据集:

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

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

标签: rdatedataframeappend

解决方案


我们可以首先通过在末尾date1粘贴将日期转换为实际日期对象 ( ),然后使用我们为每个 1 个月的日期对象创建序列。然后,我们使用to get equal to the before it 并以我们再次从中删除的原始形式获取数据。"-01"completePersonfillAmount"-01"date1

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))

推荐阅读