r - 插入行以填写 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
我希望我能把我的问题说清楚。提前致谢。
解决方案
我们可以首先通过在末尾date1
粘贴将日期转换为实际日期对象 ( ),然后使用我们为每个 1 个月的日期对象创建序列。然后,我们使用to get equal to the before it 并以我们再次从中删除的原始形式获取数据。"-01"
complete
Person
fill
Amount
"-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))
推荐阅读
- angular - 如何在 Angular 中扩展或添加数据到 cdk-steps?
- javascript - 如何在javascript中使用正则表达式格式化文本?
- php - 如何在 psql 上正确选择
- angular - 在下拉列表中未选择任何内容时,Angular 9禁用按钮
- sql - SQL 选择和连接表结果缺少 2 列
- sendgrid - 如何在 GoDaddy 中配置 SendGrid 发件人身份验证(域验证)
- python-3.x - 在Python中转换黑白图像中1和0的列表列表
- angularjs - 与字符串组合相关的angularJS问题
- javascript - 删除数组中的元素
- python - python的ping命令