通过与完整的数据框合并来填补空白?

Fill in gaps by merging with dataframe which is complete?

我正在尝试完成一个有间隙的数据框。数据按小时构建,小时之间有一些跳跃。这是数据框的示例:

sms <- read.csv("hoursms2.csv", sep = ";", header = FALSE)
sms$date <- strptime(sms$date,"%d/%m/%Y %H:%M")

date                      count

2015-12-17 22:00:00        5
2015-12-18 09:00:00        7
2015-12-18 10:00:00        3
2015-12-18 12:00:00        6

我尝试的是创建另一个数据帧,它的范围从第一个数据帧的开始到结束,但是有所有的时间和一个唯一的标识符来跟踪它:

hh <- seq(min(sms$date), max(sms$date), by="hour")
hh <- as.data.frame(hh)
hh <- cbind(hh,seq(1:3292))   #length of the hh data frame

给出以下内容:

date                     id
2015-12-04 12:00:00      1
2015-12-04 13:00:00      2
2015-12-04 14:00:00      3 
2015-12-04 15:00:00      4
2015-12-04 16:00:00      5

到目前为止,我已经尝试了我在 Whosebug 上找到的这三件事,here,但在这种情况下它们不起作用:

res <- merge(sms,hh,by = "date", all = TRUE)
res2 <- res[duplicated(res$date), ]
res3 <- res[!duplicated(res), ]

第一个命令 res,其作用是复制所有单元格,它不会按日期合并,因此它给出以下内容:

2015-12-23 19:00:00      5
2015-12-23 19:00:00      NA

另一个把一切都搞砸了。我认为这与未正确关联但不确定的日期格式有关。关于如何按日期完成我的数据框的任何建议?

使用库 dplyr,执行以下操作确保两个数据框中的类型正确。

下面是我设置两个数据框的方式:

str(sms)
'data.frame':   4 obs. of  2 variables:
 $ date : POSIXct, format: "2015-12-17 22:00:00" "2015-12-18 09:00:00" "2015-12-18 10:00:00" ...
 $ count: int  5 7 3 6
str(hh)
'data.frame':   15 obs. of  2 variables:
 $ date: POSIXct, format: "2015-12-17 22:00:00" "2015-12-17 23:00:00" "2015-12-18 00:00:00" ...
 $ id  : int  1 2 3 4 5 6 7 8 9 10 ...

这里是左连接代码:

library(dplyr)
left_join(hh, sms)
Joining by: "date"
                  date id count
1  2015-12-17 22:00:00  1     5
2  2015-12-17 23:00:00  2    NA
3  2015-12-18 00:00:00  3    NA
4  2015-12-18 01:00:00  4    NA
5  2015-12-18 02:00:00  5    NA
6  2015-12-18 03:00:00  6    NA
7  2015-12-18 04:00:00  7    NA
8  2015-12-18 05:00:00  8    NA
9  2015-12-18 06:00:00  9    NA
10 2015-12-18 07:00:00 10    NA
11 2015-12-18 08:00:00 11    NA
12 2015-12-18 09:00:00 12     7
13 2015-12-18 10:00:00 13     3
14 2015-12-18 11:00:00 14    NA
15 2015-12-18 12:00:00 15     6

注意:我必须将 hh 中的列名转换为 date,因为所提供的相关代码不会这样做。或者,您可以在 left_join 调用中指定 by 参数。