为数据框中不存在的观察添加行(带日期)

Adding rows (with dates) for observations that do not exist in the dataframe

我对以下格式的数据有一个简单的问题(date 是 dd/m/yy)。数据输入代码在问题下方。

#>      date  a  b
#> 1 25/1/20 10 20
#> 2 26/1/20 20 40

如何为整个 1 月份添加行,ab 的值为 0?

我想要的输出是:

#>      date  a  b
#> 1 01/1/20  0  0
#> 2 02/1/20  0  0
#> ...
#> ...
#>   25/1/20 10 20
#>   26/1/20 20 40

首选 Tidyverse 答案,但我对任何解决方案都很满意。

数据输入代码:

df <- data.frame(
  stringsAsFactors = FALSE,
              date = c("25/1/20", "26/1/20"),
                 a = c(10L, 20L),
                 b = c(20L, 40L)
)

您可以使用新的数据框然后加入。关键是根据 df 上的最大日期创建一个新的数据框,并从第一天开始定义一个序列。这里的代码:

library(dplyr)
library(lubridate)
#Data
df <- data.frame(
  stringsAsFactors = FALSE,
  date = c("25/1/20", "26/1/20"),
  a = c(10L, 20L),
  b = c(20L, 40L)
)
#Code 1
df %>% mutate(date=dmy(date)) -> df
#Identify max date
maxdate <- max(df$date)
#Set initial day
startday <- as.Date(paste0(format(maxdate,'%Y-%m'),'-01'))
#New data frame
ndf <- data.frame(date=seq(startday,maxdate,by=1))
#Join
ndf %>% left_join(df) %>% replace(is.na(.),0)

输出:

         date  a  b
1  2020-01-01  0  0
2  2020-01-02  0  0
3  2020-01-03  0  0
4  2020-01-04  0  0
5  2020-01-05  0  0
6  2020-01-06  0  0
7  2020-01-07  0  0
8  2020-01-08  0  0
9  2020-01-09  0  0
10 2020-01-10  0  0
11 2020-01-11  0  0
12 2020-01-12  0  0
13 2020-01-13  0  0
14 2020-01-14  0  0
15 2020-01-15  0  0
16 2020-01-16  0  0
17 2020-01-17  0  0
18 2020-01-18  0  0
19 2020-01-19  0  0
20 2020-01-20  0  0
21 2020-01-21  0  0
22 2020-01-22  0  0
23 2020-01-23  0  0
24 2020-01-24  0  0
25 2020-01-25 10 20
26 2020-01-26 20 40

将'date'转换为Date后,我们可以在tidyverse中使用complete class

library(dplyr)
library(tidyr)
library(lubridate)
df %>% 
   mutate(date = dmy(date)) %>% 
   complete(date = seq(floor_date(min(date), 'month'),  max(date), 
         by = 'day'), fill = list(a = 0, b = 0))
# A tibble: 26 x 3
#   date           a     b
#   <date>     <dbl> <dbl>
# 1 2020-01-01     0     0
# 2 2020-01-02     0     0
# 3 2020-01-03     0     0
# 4 2020-01-04     0     0
# 5 2020-01-05     0     0
# 6 2020-01-06     0     0
# 7 2020-01-07     0     0
# 8 2020-01-08     0     0
# 9 2020-01-09     0     0
#10 2020-01-10     0     0
# … with 16 more rows