【发布时间】:2015-07-23 14:33:08
【问题描述】:
我编写了一段代码来计算一些 200k 产品的弹性。弹性正在计算中,但已经超过 15 小时,并且该过程仍在运行。我看到正在创建新对象。在不使用 for 循环的情况下,是否有更快的替代方法?
下面是我的代码:
sku_list <- unique(transact_data4$productId)
elasticity_values <- data.frame()
for (i in 1:length(sku_list)){
test_sku <- subset(transact_data4, productId==sku_list[i])
m1 <- lm(formula=sales~price, data= test_sku)
coeffs <- as.data.frame(m1[[1]])
gradient<- coeffs[2,1]
gradient_final <- ifelse(is.na(gradient), -1, gradient)
mean_price <- mean(test_sku$price)
mean_sales <- mean(test_sku$sales)
elasticity <- gradient_final*mean_price/mean_sales
sku_elasticity <- cbind(sku_list[i],elasticity)
elasticity_values <- rbind(elasticity_values,sku_elasticity)
}
colnames(elasticity_values)[colnames(elasticity_values)=="V1"] <- "productId"
这是一个示例数据集:
transact_data <- data.frame(productId=c('A', 'A','A', 'A','A', 'A','B', 'B','B', 'B','B', 'B'),
price=c(10, 10.5, 11, 12,10, 9,
10, 11, 13, 11,12.5, 11),
sales =c(100,93,90,85,99,110,101,95,80,103,82,102), stringsAsFactors=FALSE)
结果:
productId elasticity
1 A -0.913344887348354
2 B -1.03051724343462
有没有更快的方法可以在不使用 for 循环的情况下实现这一点? 显然,由于样本较小(只有 2 个 productId),它运行得很快。 但我试图为超过 20 万个 productId 运行它。
谢谢。
【问题讨论】: