我有一个看起来像这样的数据集:
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
通过"-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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句