我的数据框看起来像这样。如果没有小时的数据,那么一天中的小时甚至没有一行。数据中的小时数从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
....
答案 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)
正如其他人所提到的,您可以使用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