【发布时间】:2015-05-18 03:19:03
【问题描述】:
我有两个数据框,df.events 和 df.activ。
df.activ 具有非常精细的分钟级数据,并且比具有约 100,000 条记录的 df.events 多一个数量级的记录(1,000,000+),也是分钟级粒度。这两个数据帧有两个公共字段,日期时间和地理。两个 DateTime 列都采用 as.POSIXlt, %Y-%m-%d %H:%M:%S 格式。
df.activ <- read.table(text=
'"DateTime","Geo","Bin1","Bin2"
2014-07-01 00:11:00,NA,0,0
2014-07-01 00:11:00,NA,0,0
2014-07-01 00:11:00,NA,0,0
2014-07-01 00:11:00,NA,0,0
2014-07-01 00:11:00,NA,0,0
2014-07-01 00:12:00,NA,0,0
2014-07-01 00:12:00,510,0,1
2014-07-01 00:12:00,NA,0,0
2014-07-01 00:12:00,NA,0,0
2014-07-01 00:12:00,NA,0,0
2014-07-01 00:12:00,NA,0,0
2014-07-01 00:12:00,NA,0,0
2014-07-01 00:13:00,618,1,1
2014-07-01 00:13:00,510,0,1
2014-07-01 00:13:00,NA,0,0
2014-07-01 00:13:00,NA,0,0
2014-07-01 00:13:00,NA,0,0
2014-07-01 00:13:00,NA,0,0
2014-07-01 00:13:00,NA,0,0
2014-07-01 00:13:00,NA,0,0
2014-07-01 00:13:00,NA,0,0',header=TRUE,sep=",")
df.events <- read.table(text=
'"Units","Geo","DateTime"
225,999,2014-07-01 00:09:00
40,510,2014-07-01 00:12:00
5,999,2014-07-01 00:28:00
115,999,2014-07-01 00:44:00
0,999,2014-07-01 00:47:00',header=TRUE,sep=",")
如果同一行(在 df.events 中)的 Geo 字段值为 999,我的目标是将 df.activ 合并到 df.events 中最近的 DateTime。
如果 df.event 的 Geo 不是 999,那么我只想在 Geo 字段匹配的情况下合并 df.event(例如,在提供的数据框中 Geo = 510 的情况)。
我知道 for 循环不是解决 R 中问题的正确方法,但从概念上讲,我希望通过循环 df.activ 的 DateTime 字段并以最接近的方式记录如果 Geo 字段为 999 或与 df.activ 中的 Geo 字段匹配,则来自 df.events 的 DateTime。
下面的数据框是我所追求的:
df.idealresults <- read.table(text=
'DateTime,Geo,Bin1,Bin2,events.DateTime,events.Units,Events.Geo
7/1/2014 0:11,NA,0,0,7/1/2014 0:09,225,999
7/1/2014 0:11,NA,0,0,7/1/2014 0:09,225,999
7/1/2014 0:11,NA,0,0,7/1/2014 0:09,225,999
7/1/2014 0:11,NA,0,0,7/1/2014 0:09,225,999
7/1/2014 0:11,NA,0,0,7/1/2014 0:09,225,999
7/1/2014 0:12,NA,0,0,7/1/2014 0:09,225,999
7/1/2014 0:12,510,0,1,7/1/2014 0:12,40,510
7/1/2014 0:12,NA,0,0,7/1/2014 0:09,225,999
7/1/2014 0:12,NA,0,0,7/1/2014 0:09,225,999
7/1/2014 0:12,NA,0,0,7/1/2014 0:09,225,999
7/1/2014 0:12,NA,0,0,7/1/2014 0:09,225,999
7/1/2014 0:12,NA,0,0,7/1/2014 0:09,225,999
7/1/2014 0:13,618,1,1,7/1/2014 0:09,225,999
7/1/2014 0:13,510,0,1,7/1/2014 0:12,40,510
7/1/2014 0:13,NA,0,0,7/1/2014 0:09,225,999
7/1/2014 0:13,NA,0,0,7/1/2014 0:09,225,999
7/1/2014 0:13,NA,0,0,7/1/2014 0:09,225,999
7/1/2014 0:13,NA,0,0,7/1/2014 0:09,225,999
7/1/2014 0:13,NA,0,0,7/1/2014 0:09,225,999
7/1/2014 0:13,NA,0,0,7/1/2014 0:09,225,999
7/1/2014 0:13,NA,0,0,7/1/2014 0:09,225,999',header=TRUE,sep=',')
到目前为止,我已经能够将 df.activ 合并到 df.events 中最近的 DateTime。我使用受this SO post 答案后半部分启发的基于 na.locf 的方法完成了此操作。我一直在努力尝试将地理匹配逻辑合并到这种方法中; na.locf 的性质使得这项工作难以正常进行,因为它依赖于在合并步骤之前绑定的向量到向量 NA。
【问题讨论】:
-
我不明白为什么 Geo==510 在 df.idealresults 中出现两次
-
你能回答你到目前为止所做的事情吗?
-
@ExperimenteR 假设一个错字,因为在数据中它应该是第 7 行的 507。
-
是的,那是我的错误。我现在已经纠正了。为可能造成的混乱道歉。
-
@leaRningR909 我看到多米尼克已经给了你一个很好的答案。以防万一,如果您想提高性能,您可能需要考虑从
data.table包或inner_join来自dplyr包的滚动连接。
标签: r datetime merge dataframe time-series