【问题标题】:Fill in gaps by merging with dataframe which is complete?通过与完整的数据框合并来填补空白?
【发布时间】:2016-05-13 12:50:39
【问题描述】:

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

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

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

【问题讨论】:

  • 其中一种方法是使用来自dplyr 包的left_join()。你做left_join(hh, sms),我认为这应该给你你想要的。
  • @Gopala 刚试了一下,出现以下错误: Joining by: "date" Error: cannot join on columns 'date' x 'date': Can't join on 'date' x 'date ' 因为不兼容的类型(POSIXct、POSIXt / POSIXlt、POSIXt)

标签: r date merge posixct


【解决方案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,因为提供的代码没有这样做。或者,您可以在left_join 调用中指定by 参数。

【讨论】:

  • 非常感谢!问题确实出在日期格式上!
猜你喜欢
  • 2016-04-02
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2015-04-12
  • 1970-01-01
  • 2015-08-19
相关资源
最近更新 更多