【问题标题】:How do we build a loop/ if statement that meets several conditions at once?我们如何构建一个同时满足多个条件的循环/ if 语句?
【发布时间】:2019-05-13 10:06:06
【问题描述】:

我们有一个包含 150 个啤酒品牌的大型数据集,在 399 周期间在 85 家商店销售。 品牌仍然分为子品牌(例如:品牌=百威,但子品牌仍然存在:百威轻/百威普通等) 我们想要创建一个函数来创建一个新列,在以下情况下为我们提供每个品牌的平均价格: - 品牌相同, - 星期是一样的,并且 - 商店是一样的。

因此,我们的目标是获得一个列,显示每个品牌每周每家商店的 1 个平均价格(例如:百威啤酒在第 1 周的商店 1)。我们很难创建这个 if 语句/循环,因为我们是 R 的新手。

到目前为止,我们已经尝试通过了解它在没有循环的情况下如何工作来解决这一步。因此,我们选择了特定的商店、品牌和周,并创建了一个向量。像这样,我们可以创建向量 mean_price,它将所有子品牌每周每家商店的所有价格相加,然后将它们除以子品牌的数量(通过求和的向量计算得出)。

try1 <- subset(beer, select = c("brand","week","store","price_ounce","logprice_ounce", "sales_ounce","logsales_ounce"))

try1$vector <- c(1)

store5 <- subset(try1, store==5 & week==224 & brand=="ariel")
mean_price <- (sum(store5$logprice_ounce)/(sum(store5$vector)))
View(mean_price)
``

So far this leads to only one mean price, but we would like to have a column that displays 1 mean price per brand & store & week.
In the end, we need this to perform a regression to estimate price elasticities per store.

We are looking forward to any kind of help as we are completely lost.
Thank you in advance!

【问题讨论】:

    标签: r loops if-statement


    【解决方案1】:

    Dplyr 库非常适合这种类型的分析。您可以使用以下方法在 dplyr 中实现每家商店/品牌/啤酒的平均值:

    library(dplyr)
    
    brand <- c("bud", "bud", "bud")
    week <- c(1,1,1)
    store <- c("A", "A", "A")
    price_ounce <- c(2,3,2.2)
    
    data <- data.frame(brand, week, store, price_ounce) %>%
      mutate(logprice_ounce = log(price_ounce))
    
    answer <- data %>% 
      group_by(brand, week, store) %>%
      summarise(meanPrice = mean(price_ounce),
                geomMeanPrice = exp(mean(logprice_ounce)))
    

    您可能会发现这本书很有用: R for Data Science

    【讨论】:

    • 非常感谢!这完美无缺。如果我们需要几何平均值,我们如何计算它? geoMEAN 和geometric.mean 不起作用
    • 您可以在汇总函数调用中构建您的逻辑。因此,在您的示例中,将上面的汇总替换为 summarise(geomMeanPrice = exp(mean(log(logprice_ounce))))。或者如果价格已经被对数转换:summarise(geomMeanPrice = exp(mean(logprice_ounce)))。 stackoverflow.com/questions/33554556/…
    • 不幸的是,这不起作用。我们收到此错误消息:Fehler in summarise_impl(.data, dots) : Evaluation error: as_dictionary() is defunct as of rlang 0.3.0.请改用as_data_pronoun()
    • 我已经编辑了我的答案以包含简单的测试数据和几何平均值。
    【解决方案2】:

    实际上,你不需要任何循环来做你想做的事。 例如,您可以使用库 data.table

    library(data.table)    
    beer[, Mean:=mean(price_ounce), by=list(brand,week,store)]
    

    您可以使用另一个名为 dplyr 的库来执行此操作,但我建议您查看 data.table,它在处理大型数据集时速度更快.

    希望对你有帮助。

    【讨论】:

    • 谢谢@Mez13 对于我们的回归,我们还需要将 logsales_ounce 的总和包括在内:+ summarise(sumSales = sum(logsales_ounce)) 不起作用...
    • 所以你只是想在你刚刚编辑的时候添加另一列,对吧?你需要遵循同样的逻辑,我的意思是beer[, Sum_log:=sum(logsales_ounce), by=list(brand,week,store)]。你的要求我说对了吗?顺便说一句,如果您觉得我的回答有用,您能同意我的回答吗? :)
    猜你喜欢
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多