私は2つのデータセットを持っています: competitor_data - 競合他社価格が収集された価格と日付だけでなく、特定の製品の競合他社も含まれています。入れ子ループの代わりにR
product_price - 各価格変更の日付。 PRODUCT_PRICE内の指定された製品については
competitor_data <- data.frame(productId=c('banana', 'banana','banana', 'banana','banana', 'banana','fig', 'fig','fig', 'fig','fig', 'fig'),
crawl_date=c("2014-04-05", "2014-04-22", "2014-05-05", "2014-05-22","2014-06-05", "2014-06-22",
"2014-05-08", "2014-06-17", "2014-06-09", "2014-06-14","2014-07-01", "2014-08-04"),
competitor =c("amazon","apple","google","facebook","alibaba","tencent","ebay","bestbuy","gamespot","louis vuitton","gucci","tesla"),
competitor_price =c(2.5,2.35,1.99,2.01,2.22,2.52,5.32,5.56,5.01,6.01,5.86,5.96), stringsAsFactors=FALSE)
competitor_data$crawl_date = as.Date(competitor_data$crawl_date)
#
product_price <- data.frame(productId=c('banana', 'banana','banana', 'banana','banana', 'banana','fig', 'fig','fig', 'fig','fig', 'fig'),
date=c("2014-05-05", "2014-06-22", "2014-07-05", "2014-08-31","2014-05-03", "2014-02-22",
"2014-05-21", "2014-06-19", "2014-03-09", "2014-06-22","2014-07-03", "2014-09-08"),
price =c(2.12,2.31,2.29,2.01,2.04,2.09,5.22,5.36,5.21,5.91,5.36,5.56), stringsAsFactors=FALSE)
product_price$date = as.Date(product_price$date)
目的
- 、各レコード(日)のために、competitor_dataから 関連crawl_date価格を見つけます。
- product_price $の価格を最低のcompetitor_data $ competitor_priceと比較してください。
- PRODUCT_PRICEの$価格< = competitor_data $ competitor_price場合は、フラグ1(price_leader)他のフラグを0(price_leader)に新しい列を作成
ループのネストされたを使用して、以下の私のスクリプトが、それはに24時間以上かかりますプロセス5000ユニークproduct_id:
unique_skus <- unique(product_price$productId)
all_competitive_data <- data.frame()
mid_step_data <- data.frame()
start_time <-Sys.time()
for (i in 1:length(unique_skus)){
step1 <- subset(product_price, productId == unique_skus[i])
transact_dates = unique(step1$date)
for (a in 1:length(transact_dates)){
step2 <- subset(step1, date ==transact_dates[a])
step3 <- inner_join(step2,competitor_data, by='productId')
if (nrow(subset(step3, date > crawl_date)) == 0){
step3 <- step3[ order(step3$crawl_date , decreasing = FALSE),]
competitor_price <- head(step3,1)$competitor_price
step2$competitor_price = competitor_price
}
else {
step4 <- subset(step3, date > crawl_date)
step4 <- step4[ order(step4$crawl_date , decreasing = TRUE),]
competitor_price <- head(step4,1)$competitor_price
step2$competitor_price = competitor_price
}
step2$price_leader <- ifelse(step2$price <= step2$competitor_price, 1, 0)
mid_step_data = rbind(mid_step_data,step2)
}
all_competitive_data <- rbind(all_competitive_data,mid_step_data)
}
Sys.time()-start_time
all_competitive_data = unique(all_competitive_data)
dplyrを使用してこれを行う方法はありますか?
crawl_dateは必ずしも日付にマッピングされていないため、なぜ2つの価格の列 – rawr
を比較し、製品ID、日付ごとに二つのデータセットをマージしません。私のコードの文があるかどうか見てください。 – BlackHat
あなたは次の最も近い日付の価格を選んでいるので、マージ後に最後の観測は繰り越し機能を使用してNAsを埋めます – rawr