2016-12-24 12 views
0

最初のデータフレームの各行について2つのデータフレームが与えられた場合、同じproduct_idを持つ行が見つかるが、visiting_timeの行がより大きく、 2つの行は最小です。 cart_add_dataの2番目の行がpurchase_dataの最初の行と一致するR:2つのデータフレームから最小の時間間隔で一致する行

例えば

ところで、計算効率も重要です。

データフレーム: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

しきい値がない場合、一致する行が複数ある場合は、最小の時間間隔で行を保持します。一致する行が1つしかない場合は、それを保管してください。 – 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),])) 
関連する問題