【问题标题】:Adding hour and 0 count where it is missing from data [duplicate]在数据中缺少小时数和 0 计数 [重复]
【发布时间】:2018-03-28 20:15:57
【问题描述】:

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

【问题讨论】:

  • tidyr::complete(DF, V1, V2 = 1:24, fill=list(V3 = 0)) 是一种方式,见stackoverflow.com/q/45992101
  • @Frank 成功了!非常感谢!
  • 两者兼得。试试看……

标签: r dataframe hour


【解决方案1】:

正如其他人提到的,您可以使用dplyr 和tidyr。
对于您的特定列名称,这归结为:

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

【讨论】:

    【解决方案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)]
    

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

    【讨论】:

      猜你喜欢
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 2015-09-10
      相关资源
      最近更新 更多