根据组中缺少的日期添加行

时间:2018-03-16 21:54:35

标签: r dataframe

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

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

请注意,第1组有2个连续日期,第2组有3个连续日期,第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))

只添加了一行,因为第3组缺少一个日期。第1组没有添加日期,因为它的所有日期都在最小值(2017-12-01)和最大日期(2018-01-01)之间。

2 个答案:

答案 0 :(得分:4)

您可以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))

答案 1 :(得分:0)

tidyr::completedplyr一起使用的

@MKR's approach是好的,但是如果组列不是数字,则会失败。然后将其作为要素进行类型转换,然后complete()操作将为每个组的每个要素/时间组合显示一行标题。

complete()不需要将组变量作为第一个参数,因此解决方案是

library(dplyr)
library(tidyr)

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