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

时间:2018-03-28 20:15:58

标签: r dataframe hour

我的数据框看起来像这样。如果没有小时的数据,那么一天中的小时甚至没有一行。数据中的小时数从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
  ....

2 个答案:

答案 0 :(得分:2)

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

使用CJ中的交叉联接data.table创建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')

答案 1 :(得分:1)

正如其他人所提到的,您可以使用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