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

时间:2016-05-13 12:50:40

标签: r date merge posixct

我正在尝试完成一个有差距的数据框。数据按小时结构,并且在几小时之间有一些跳跃。这是数据帧的示例:

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

到目前为止,我已经尝试了在StackOverflow 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

另一个搞砸了一切。我认为这与日期格式有关,而日期格式没有正确关联,但不确定。有关如何按日期填写数据框的建议吗?

1 个答案:

答案 0 :(得分:1)

使用库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,因为相关提供的代码不会这样做。或者,您可以在by来电中指定left_join参数。