伪数据组:(从我的数据集差异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当然,是在上面。不过谢谢。 –