Я пытаюсь запустить цикл for для приведенного ниже сценария.
У меня 100 000 уникальных покупателей в моей транзакционной таблице, которые собираются в n магазинов по каждому покупателю.Я пытаюсь перебрать каждого покупателя и посмотреть, в каком уникальном магазине он находится, и если новый магазин открылся в радиусе 20 км от этого магазина, то он / она пойдет в этот магазин, и я выставлю значение 1 в новом фрейме данныхсоздано.Я инициализирую мой код сначала для цикла, а затем повторяю то же самое для остальной части моего фрейма данных.Мой код очень медленный с циклом for.Я не знаю, как векторизовать мой код.Ниже приведен снимок моего кода.Пожалуйста, подскажите, как сделать этот код быстрее и эффективнее.
cust_id = c(unique(kk$Customer_ID))
i = cust_id[1]
# for initializing
s = c(0,0,0,0)
df_temp = kk[kk$Customer_ID == i]
store = c(unique(df_temp$Store_Code))
system.time(
for (j in store){
if(df_temp[Store_Code == j]$dist.km298 < 20) {
s[1] <- 1
}
if(df_temp[Store_Code == j]$dist.km299 < 20) {
s[2] <- 1
}
if(df_temp[Store_Code == j]$dist.km300 < 20) {
s[3] <- 1
}
if(df_temp[Store_Code == j]$dist.km301 < 20) {
s[4] <- 1
}
}
)
vishal <- data.table("Customer_ID" = c(i,i,i,i) , "Store_Code" =
c(60298,60299,60300,60301), "Prediction" = s)
cust_id <- cust_id[!cust_id %in% c(cust_id[1])]
# loop for all customers
count = 1
system.time(for (k in 1:length(cust_id)){
i <- cust_id[k]
# count <- count+1
# if (count == 5) {
# break
#}
s = c(0,0,0,0)
df_temp = kk[kk$Customer_ID == i]
store = c(unique(df_temp$Store_Code))
for (j in store){
#if(df_temp$Store_Code == j & df_temp$Purchase_2016 != 0 &
df_temp$Purchase_2017 == 0){
if(df_temp[Store_Code == j]$dist.km298 < 20) {
s[1] <- 1
}
if(df_temp[Store_Code == j]$dist.km299 < 20) {
s[2] <- 1
}
if(df_temp[Store_Code == j]$dist.km300 < 20) {
s[3] <- 1
}
if(df_temp[Store_Code == j]$dist.km301 < 20) {
s[4] <- 1
}
}
v_temp <- data.table("Customer_ID" = c(i,i,i,i) , "Store_Code" =
c(60298,60299,60300,60301), "Prediction" = s)
l = list(vishal,v_temp)
vishal <- rbindlist(l)
}
)
dput(head(kk, 5))
structure(list(Customer_ID =
structure(c(1800000006365760, 1800000006365820,1800000006366060
,1800000006366060,1800000006366060), class = "integer64"), Store_Code =
c(60067, 60054, 60066,
60069, 60079), Purchase_2016 = c(2L, 1L, 1L, 1L, 2L), Purchase_2017 =
c(2L,
0L, 0L, 0L, 0L), TotalPurchases = c(4L, 1L, 1L, 1L, 2L), Return_2016 =
c(0L,
0L, 0L, 0L, 0L), Return_2017 = c(0L, 0L, 0L, 0L, 0L), Return_2010 = c(0L,
0L, 0L, 0L, 0L), Rp_Ratio_2016 = c(0, 0, 0, 0, 0), Rp_Ratio_2017 = c(0,
0, 0, 0, 0), Sales_Per_Day = c(1699.6, 2101.1, 1331.4, 1813.1,
1193.1), Store_Launch_Date = structure(c(1323820800, 1322006400,
1338163200, 1311984000, 1385164800), class = c("POSIXct", "POSIXt"
), tzone = "UTC"), Store_Size_Sq_Ft = c(8673.5, 12425.5, 15897.1,
6698.1, 3699.5), Customer_Count = c(89351, 118444, 79249, 114246,
54832), Total_Revenue = c(35350868.4, 43702303, 27693164.7, 37712369.7,
24816886.2), dist.km298 = c(140.24, 123.87, 10.2, 131.96, 128.52
), dist.km299 = c(163.37, 140.2, 79.32, 153.01, 145.03), dist.km300 =
c(4.09,
21.05, 126.55, 7.03, 17.41), dist.km301 = c(5.72, 19.04, 125.46,
5.02, 15.4), Nationality = c("INDIA", "UNITED ARAB EMIRATES",
"SRI LANKA", "SRI LANKA", "SRI LANKA"), Gender = c("M", "F",
"M", "M", "M"), Marital_Status = c("Married", "Married", "Married",
"Married", "Married"), Loyalty_Status = c("Gold", "Silver", "Silver",
"Silver", "Silver"), Points = c(814L, 212L, 186L, 186L, 186L),
Age = c(59L, 119L, 59L, 59L, 59L), LastVisit = c(2, 28, 3,
3, 3), Last_rdm_txn_dt1 = structure(c(17601, 16510, 17196,
17196, 17196), class = "Date"), Last_accr_txn_dt1 = structure(c(17801,
17029, 17774, 17774, 17774), class = "Date")), .Names = c("Customer_ID",
"Store_Code", "Purchase_2016", "Purchase_2017", "TotalPurchases",
"Return_2016", "Return_2017", "Return_2010", "Rp_Ratio_2016",
"Rp_Ratio_2017", "Sales_Per_Day", "Store_Launch_Date",
"Store_Size_Sq_Ft",
"Customer_Count", "Total_Revenue", "dist.km298", "dist.km299",
"dist.km300", "dist.km301", "Nationality", "Gender", "Marital_Status",
"Loyalty_Status", "Points", "Age", "LastVisit", "Last_rdm_txn_dt1",
"Last_accr_txn_dt1"), sorted = "Customer_ID", class = c("data.table",
"data.frame"), row.names = c(NA, -5L), .internal.selfref = <pointer:
0x0000000004810788>)