簡體   English   中英

更改列時如何避免R中的for循環

[英]How to avoid for loop in R when altering a column

我正在使用一個看起來與下面非常相似的數據框:

圖片在這里,很抱歉,沒有足夠的聲譽

這是一個600,000行的數據幀。 我要做的是針對同一日期內的每個重復實例,我想將成本除以重復實例的總數。 我也只想考慮那些屬於“銷售”策略的人。

因此,例如,在1/1/16中,有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)
      }
  }
}

它效率極低且速度慢。 我知道必須有一種更好的方法來實現這一目標。 任何幫助將非常感激。 謝謝!

ave()可以提供無需其他程序包的解決方案:

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

使用dplyr

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

我不清楚您所說的“實例”是什么意思。 這(很明顯)按日期,打包和戰術分組,因此將這些列的每個唯一組合視為一個分組器。 如果您在“實例”的定義中未包含Tactic ,則可以將其刪除,僅按日期和數據包進行分組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM