【问题标题】:How to avoid for loop in R when altering a column更改列时如何避免R中的for循环
【发布时间】:2016-03-03 19:50:24
【问题描述】:

我正在使用一个看起来与下面非常相似的数据框:

Image here, unfortunately don't have enough reputation yet

这是一个 600,000 行的数据框。我想要做的是对于同一日期内的每个重复实例,我想将成本除以重复实例的总数。我还想只考虑那些属于“销售”策略的人。

例如,在 2016 年 1 月 1 日,有 2 个“帮助包”也属于“销售”策略。因为在同一日期内有 2 个实例,我想将每个实例的成本除以 2(因此每个实例的成本为 5 美元)。

这是我的代码:

for(i in 1:length(dfExample$Date)){
  if(dfExample$Tactic) == "Sales"){
    list = agrep(dfExample$Package[i], dfExample$Package)
    for(i in list){
      date_repeats = agrep(i, dfExample$Date)
      dfExample$Cost[date_repeats] = dfExample$Package[i]/length(date_repeats)
      }
  }
}

这是非常低效和缓慢的。我知道必须有更好的方法来实现这一目标。任何帮助将非常感激。谢谢!

【问题讨论】:

  • 没有人想要数据图像。与dput(droplevels(head(your_data))) 共享您的数据。它将是可复制/可粘贴的并保留列类。

标签: r performance loops for-loop vector


【解决方案1】:

ave()可以给出解决方案,无需额外的包:

with(dfExample, Cost / ave(Cost, Date, Package, Tactic, FUN=length))

【讨论】:

    【解决方案2】:

    使用dplyr

    library(dplyr)
    dfExample %>%
        group_by(Date, Package, Tactic) %>%
        mutate(Cost = Cost / n())
    

    我有点不清楚您所说的“实例”是什么意思。这(非常清楚)按日期、包和策略分组,因此将这些列的每个唯一组合视为一个分组。如果您没有在“实例”的定义中包含Tactic,那么您可以将其删除以仅按日期和包进行分组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 2018-03-13
      • 2014-07-17
      • 2020-06-29
      • 2011-06-21
      相关资源
      最近更新 更多