僞數據組:(從我的數據集差異ITEM_CODE是串在我的情況)優化for循環中的R
in_cluster <- data.frame(item_code = c(1:500))
in_cluster$cluster <-
sample(5, size = nrow(in_cluster), replace = TRUE)
real_sales <- data.frame(item_code = numeric(0), sales = numeric(0))
real_sales <-
data.frame(
item_code = sample(500, size = 100000, replace = TRUE),
sales = sample(500, size = 100000, replace = TRUE)
)
mean_trajectory <- data.frame(sales = c(1:52))
mean_trajectory$sales <- sample(500, size = 52, replace = TRUE)
training_df <- data.frame(
LTF_t_minus_1 = numeric(0),
LTF_t = numeric(0),
LTF_t_plus_1 = numeric(0),
RS_t_minus_1 = numeric(0),
RS_t = numeric(0),
STF_t_plus_1 = numeric(0)
)
training_df[nrow(training_df) + 1, ] <-
c(0, 0, mean_trajectory$sales[[1]], 0, 0, 19) # week 0
week = 2
我有R中一個簡單的函數中,所有我做的是:
system.time({
for (r in 1:nrow(in_cluster)) {
item <- in_cluster[r,]
sale_row <-
dplyr::filter(real_sales, item_code == item$item_code)
if (nrow(sale_row) > 2) {
new_df <- data.frame(
LTF_t_minus_1 = mean_trajectory$sales[[week - 1]],
LTF_t = mean_trajectory$sales[[week]],
LTF_t_plus_1 = mean_trajectory$sales[[week + 1]],
RS_t_minus_1 = sale_row$sales[[week - 1]],
RS_t = sale_row$sales[[week]],
STF_t_plus_1 = sale_row$sales[[week + 1]]
)
training_df <-
bind_rows(training_df, new_df)
}
}
})
我很新的R和發現這個很奇怪看多小時實在是又多久(421.59 seconds
通過500行循環)它通過數據幀採取循環。
EDIT_IMPORTANT:不過,對於上面給出的僞數據組時採取了1.10 seconds
得到輸出>可這是因爲具有ITEM_CODE字符串?是否需要很多時間來處理字符串item_code。 (我沒有使用假人數據集的字符串,因爲我不知道該怎麼對item_code
500個獨特的字符串in_cluster
,並且具有相同的字符串作爲real_sales
item_code
)
我通過建議的方式少的其他文章閱讀來優化將R代碼,並使用用於bind_rows
代替rbind
或:使用bind_rows
training_df[nrow(training_df) + 1,] <-
c(mean_trajectory$sales[[week-1]], mean_trajectory$sales[[week]], mean_trajectory$sales[[week+1]], sale_row$sales[[week-1]], sale_row$sales[[week]], sale_row$sales[[week+1]])
似乎已經通過36秒通過500行數據幀的循環時改善了性能in_cluster
在這種情況下可以使用lapply嗎?我想下面的代碼,並得到了一個錯誤:
Error in filter_impl(.data, dots) : $ operator is invalid for atomic vectors
myfun <- function(item, sales, mean_trajectory, week) {
sale_row<- filter(sales, item_code == item$item_code)
data.frame(
LTF_t_minus_1 = mean_trajectory$sales[[week-1]],
LTF_t = mean_trajectory$sales[[week]],
LTF_t_plus_1 = mean_trajectory$sales[[week+1]],
RS_t_minus_1 = sale_row$sales[[week-1]],
RS_t = sale_row$sales[[week]],
STF_t_plus_1 = sale_row$sales[[week+1]])
}
system.time({
lapply(in_cluster, myfun, sales= sales, mean_trajectory = mean_trajectory) %>% bind_rows()
})
幫助lapply
將不勝感激,但是我的主要目標是加快循環。
請包括一個[可重現的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610),這將使其他人更容易來幫你。 – Jaap
@Jaap當然,是在上面。不過謝謝。 –