我正在尝试完成一个有差距的数据框。数据按小时结构,并且在几小时之间有一些跳跃。这是数据帧的示例:
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
另一个搞砸了一切。我认为这与日期格式有关,而日期格式没有正确关联,但不确定。有关如何按日期填写数据框的建议吗?
答案 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
参数。