2016-12-24 69 views
0

给定两个数据帧,对于第一个数据帧中的每一行,找到相同的行product_id,但visiting_time较大,且visting时间间隔两排最小。R:从两个数据帧中匹配最小时间间隔的行

例如

cart_add_data的2行与的purchase_data第一行匹配。

顺便说一句,计算效率也很重要。

数据帧:cart_add_data

visting_time   product_id 
1 2012-01-08 13:29:39 878435 
2 2012-01-08 13:36:52 122100 
3 2012-01-08 13:38:47 150473 
4 2012-01-14 21:06:36 169403 
5 2012-01-14 21:06:36 137092 

数据帧:purchase_data

visting_time   product_id 
1 2012-01-08 13:42:35  122100 
2 2012-01-08 13:42:35  138857 
3 2012-01-08 13:42:35  150473 
4 2012-01-18 22:15:04  140376 
5 2012-02-02 09:21:28  130437 
+0

什么是门槛? – akrun

+0

没有阈值,如果有多个匹配的行,只保留具有最小时间间隔的行。如果只有一个匹配的行,则保留它。 – user3237142

回答

0

我想这你想要做什么(我加了几排,以配合您的(?)其他标准:

cart_add_data <- read.csv(text="visting_time,   product_id 
2012-01-08 13:29:39, 878435 
2012-01-08 13:36:52, 122100 
2012-01-08 13:38:47, 150473 
2012-01-14 21:06:36, 169403 
2012-01-14 21:06:36, 137092") 

purchase_data <- read.csv(text=" visting_time,   product_id 
2012-01-08 13:42:35,  122100 
2012-01-08 13:42:35,  138857 
2012-01-08 13:42:35,  150473 
2012-01-18 22:15:04,  140376 
2012-02-02 09:21:28,  130437 
2012-01-14 12:06:36, 137092 
2012-01-14 22:06:36, 137092 
2012-01-14 23:06:36, 137092") 

dfr <- merge(cart_add_data, purchase_data, by="product_id") 

dfr$time_dif <- with(dfr, as.numeric(as.POSIXct(visting_time.y) - as.POSIXct(visting_time.x))) 

dfr <- subset(dfr, time_dif > 0) 
dfr <- do.call(rbind, lapply(split(dfr,dfr$product_id), 
          function(x)x[which.min(x$time_dif),])) 
相关问题