根据组内缺失的日期添加行

4

我将尝试根据每个组中的最小值和最大值向数据框添加行,假设这是我的原始数据框:

df = data.frame(Date = as.Date(c("2017-12-01", "2018-01-01", "2017-12-01", "2018-01-01", "2018-02-01","2017-12-01", "2018-02-01")),
            Group = c(1,1,2,2,2,3,3),
            Value = c(100, 200, 150, 125, 200, 150, 175))

请注意,第一组有2个连续日期,第二组有3个连续日期,第三组缺少中间的日期(2018-01-01)。我希望能够通过添加缺失的日期行来完成数据框。但问题是,我只想根据每个组内最小和最大日期之间缺失的日期来添加额外的日期。因此,如果我要完成这个数据框,它将如下所示:
df_complete = data.frame(Date = as.Date(c("2017-12-01", "2018-01-01", "2017-12-01", "2018-01-01", "2018-02-01","2017-12-01","2018-01-01", "2018-02-01")),
            Group = c(1,1,2,2,2,3,3,3),
            Value = c(100, 200, 150, 125, 200, 150,NA, 175))

因为第三组缺少一个日期,所以只添加了一行。对于第一组来说,没有添加任何日期,因为它的最小日期(2017-12-01)和最大日期(2018-01-01)之间已经包含了所有日期。

2个回答

13

您可以使用tidyr :: completedplyr找到解决方案。连续日期之间的interval似乎为month。方法如下:

library(dplyr)
library(tidyr)

df %>% group_by(Group) %>%
  complete(Group, Date = seq.Date(min(Date), max(Date), by = "month"))

# A tibble: 8 x 3
# Groups: Group [3]
# Group Date       Value
# <dbl> <date>     <dbl>
#   1  1.00 2017-12-01   100
# 2  1.00 2018-01-01   200
# 3  2.00 2017-12-01   150
# 4  2.00 2018-01-01   125
# 5  2.00 2018-02-01   200
# 6  3.00 2017-12-01   150
# 7  3.00 2018-01-01    NA
# 8  3.00 2018-02-01   175

数据

df = data.frame(Date = as.Date(c("2017-12-01", "2018-01-01", "2017-12-01", "2018-01-01",
               "2018-02-01","2017-12-01", "2018-02-01")),
                Group = c(1,1,2,2,2,3,3),
                Value = c(100, 200, 150, 125, 200, 150, 175))

这仅适用于被强制转换为数值双精度值的数字组列。如果“Group”列包含例如字符字符串,则将其强制转换为因子,并且complete()操作会针对每个组的每个因子/时间组合生成一个tibble行。 - 0range

2

MKR的方法使用dplyrtidyr::complete是不错的,但如果分组列不是数字,则会失败。然后将其转换为因子,并且complete()操作将为每个组中的每个因子/时间组合结果一个tibble行。

complete()不需要将组变量作为第一个参数,解决方案如下:

library(dplyr)
library(tidyr)

df %>% group_by(Group) %>%
  complete(Date = seq.Date(min(Date), max(Date), by = "month"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接