在数据缺失的地方添加小时和 0 计数

Adding hour and 0 count where it is missing from data

我的数据框看起来像这样。如果小时没有数据,一天中的小时甚至没有一行。数据中的小时从 0-23 代表一天中的 24 小时。有没有办法添加零计数日期的小时数,可能还有第二个数据框作为查找或其他东西?

df 日期小时计数

    2018-01-15        08    4682
    2018-01-15        09    406
    2018-01-16        05    3359
    2018-01-16        06    11926
    2018-01-16        07    42602  

我希望数据框看起来像这样:

df 日期小时计数

  2018-01-15          01    0
  2018-01-15          02    0
  2018-01-15          03    0
  2018-01-15          04    0
  2018-01-15          06    0
  2018-01-15          06    0
  2018-01-15          07    0
  2018-01-15          08    4682
  2018-01-15          09    406
  2018-01-15          10    0
  ....
  2018-01-16          05    3359
  2018-01-16          06    11926
  2018-01-16          07    42602    
  2018-01-16          08    0
  2018-01-16          09    0
  2018-01-16          10    0
  2018-01-16          11    0
  ....

你可以使用expand.grid获取列值的笛卡尔积,并使用data.table包中的连接操作

library('data.table')
df2 <- expand.grid(date = unique(df1$date), hour = 0:23, count = 0L, stringsAsFactors = FALSE)
setDT(df2)[df1, count := i.count, on = .(date, hour)]

data.table 中使用交叉连接 CJ 创建 df2 数据

df2 <- CJ(date = unique(df1$date), hour = 0:23, count = 0L)
df2[df1, count := i.count, on = .(date, hour)]

数据:

df1 <- read.table(text='2018-01-15        08    4682
2018-01-15        09    406
                  2018-01-16        05    3359
                  2018-01-16        06    11926
                  2018-01-16        07    42602 ', stringsAsFactors = FALSE)
colnames(df1) <- c('date', 'hour', 'count')

如其他人所述,您可以使用 dplyrtidyr
对于您的特定列名,这归结为:

library(dplyr)
library(tidyr)

data = "date hour count
2018-01-15        08    4682
2018-01-15        09    406
2018-01-16        05    3359
2018-01-16        06    11926
2018-01-16        07    42602"

df <- read.table(text=data, header = T)
df

df %>%
  group_by(date) %>%
  complete(hour = full_seq(1:24, 1), fill = list(count = 0))

产生:

# A tibble: 48 x 3
# Groups:   date [2]
   date        hour count
   <fct>      <dbl> <dbl>
 1 2018-01-15    1.    0.
 2 2018-01-15    2.    0.
 3 2018-01-15    3.    0.
 4 2018-01-15    4.    0.
 5 2018-01-15    5.    0.
 6 2018-01-15    6.    0.
 7 2018-01-15    7.    0.
 8 2018-01-15    8. 4682.
 9 2018-01-15    9.  406.
10 2018-01-15   10.    0.
# ... with 38 more rows