2016-12-24 36 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),])) 
相關問題