首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环弹性计算的替代方法

循环弹性计算的替代方法
EN

Stack Overflow用户
提问于 2015-07-23 14:33:08
回答 2查看 183关注 0票数 0

我已经写了一段代码来计算200 k产品的弹性。弹性正在计算,但它已经超过了15个小时,而且这个过程仍然在运行。我看到正在创建新的对象。除了不使用for循环之外,还有更快的替代方法吗?

下面是我的代码:

代码语言:javascript
复制
    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" 

下面是一个示例数据集:

代码语言:javascript
复制
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)

结果:

代码语言:javascript
复制
  productId         elasticity
1         A -0.913344887348354
2         B  -1.03051724343462

在不使用for循环的情况下,有更快的方法来实现这一点吗?显然,由于较小的示例(只有2 productId),这一过程运行得很快。但我正试图在200多万productId上运行这个程序。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-23 15:06:22

代码语言:javascript
复制
library(dplyr)

transact_data %>% group_by(productId) %>%
   do(mod = lm(sales ~ price, data = .), 
      mean.price = mean(.$price), 
      mean.sales = mean(.$sales)) %>%
   summarise(productId  = productId,
             elasticity = ifelse(is.na(coef(mod)[2]), -1, coef(mod)[2]) * 
                          mean.price / mean.sales)

#   productId elasticity
# 1         A -0.9133449
# 2         B -1.0305172

解释

使用library(dplyr),您可以方便地进行分组计算:

  • %>%是链式操作符,它通过将左参数作为右函数的第一个参数来使代码更易读。
  • group_by告诉下一个命令要按列productId分组
  • do用于计算模型和所需的平均值,在do中使用圆点.来引用整个data.frame
  • summarise最后通过计算弹性来总结您的计算

要获得更多信息,请查看vignette("introduction")

顺便说一句,您的代码非常慢,这并不奇怪,因为您使用循环,并且在循环的基础上增加循环中的数据。有关常见陷阱的一些教程,请查看inferno.pdf

票数 1
EN

Stack Overflow用户

发布于 2015-07-23 14:45:05

在这里,您如何优化代码

1)功能适用,适用,.比for循环快得多。

2)如果使用大数据,rbind和cbind是缓慢的。我建议您使用大量的列和行创建大data.frame (空),然后填充它。

玩得开心!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31590437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档