Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改列时如何避免R中的for循环_R_Performance_Loops_For Loop_Vector - Fatal编程技术网

更改列时如何避免R中的for循环

更改列时如何避免R中的for循环,r,performance,loops,for-loop,vector,R,Performance,Loops,For Loop,Vector,我正在使用一个看起来非常类似于以下内容的数据帧: 这是一个600000行数据帧。我想做的是,对于同一日期内的每个重复实例,我想将成本除以重复实例的总数。我也只想考虑那些属于“销售”策略的人。 例如,在1/1/16中,有两个“帮助包”也属于“销售”策略。因为在同一日期内有两个实例,所以我想将每个实例的成本除以2(因此每个实例的成本为5美元) 这是我的代码: for(i in 1:length(dfExample$Date)){ if(dfExample$Tactic) == "Sales")

我正在使用一个看起来非常类似于以下内容的数据帧:

这是一个600000行数据帧。我想做的是,对于同一日期内的每个重复实例,我想将成本除以重复实例的总数。我也只想考虑那些属于“销售”策略的人。 例如,在1/1/16中,有两个“帮助包”也属于“销售”策略。因为在同一日期内有两个实例,所以我想将每个实例的成本除以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)
      }
  }
}

这是难以置信的低效和缓慢。我知道一定有更好的方法来实现这一点。任何帮助都将不胜感激。谢谢大家!

使用
dplyr

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

我有点不明白你所说的“实例”是什么意思。这个(很清楚)按日期、包和战术分组,所以会考虑这些列的独特组合作为石斑。如果在“实例”的定义中未包含
策略
,则可以仅按日期和包将其删除为分组。

使用
dplyr

library(dplyr)
dfExample %>%
    group_by(Date, Package, Tactic) %>%
    mutate(Cost = Cost / n())
我有点不明白你所说的“实例”是什么意思。这个(很清楚)按日期、包和战术分组,所以会考虑这些列的独特组合作为石斑。如果在“实例”的定义中未包含
策略
,则可以仅按日期和包将其删除到组中。

ave()
可以提供无需额外包的解决方案:

with(dfExample, Cost / ave(Cost, Date, Package, Tactic, FUN=length))
ave()
可以提供无需额外软件包的解决方案:

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

没有人想要数据的图像。与
dput(液滴液位(头部(您的_数据))共享您的数据)
。它可以复制/粘贴并保留列类。没有人想要数据的图像。与
dput(液滴液位(头部(您的_数据))共享您的数据)
。它将是可复制/粘贴的,并保留列类。