如何使用 Rstudio 计算加权平均值

How to calculate weighted average with Rstudio

我将从一个例子开始:

inv <- tibble::tribble(
           ~Date, ~Material, ~Quantity,
    "2020-01-01",   "nails",       10L,
    "2020-01-01",   "nails",      100L,
    "2020-02-02",   "nails",       50L,
    "2020-02-02",   "nails",       70L,
    "2020-01-01",  "hammer",       20L,
    "2020-01-01",  "hammer",       80L,
    "2020-02-02",  "hammer",       20L,
    "2020-02-02",  "hammer",       50L
    )

这是示例数据集。原始数据集更长,包含 100 多个项目和日期。

  1. 首先我对一天的数据进行子集化
  2. 汇总当天所有商品数量
  3. 将每个项目数量除以总和(来自上一步),我们称结果为权重
  4. 将每件商品的数量乘以相应的重量,然后将每件商品的结果相加。
  5. 将第 4 步的结果除以所有权重的总和。
  6. 重复所有天数。

示例的结果应该是:

  1. 首先是 2020-01-01 日的所有项目
  2. 10 + 100 + 20 + 80 = 210
  3. 10/210 = 0.048、100/210 = 0.48、20/210 = 0.095、80/210 = 0.38
  4. 10 * 0.048 + 100 * 0.48 + 20 * 0.095 + 80 * 0.38 = 0.48 + 48 + 1.9 + 30.4 = 80.78
  5. 80.78/(0.048 + 0.48 + 0.095 + 0.38) = 80.78/1.003 = 80.54
  6. 与 2020-02-02 相同的过程

我虽然这也许可以用 for 循环实现,但这是我达到的程度,现在我被卡住了:

inv <- read.csv("Book1.csv")
inv$Date <- as.Date(inv$Date)
n <- unique(inv$Date)
item <- vector()
length(n)
for (i in 1:length(n)){
  day <- subset(inv, subset = (Date == n[i]))
  day_total <- sum(day$Quantity)
  m <- unique(day$Material)
  for (j in 1:length(m)){
    material <- subset(day, subset = (Material == m[j]))
    material_total <- sum(material$Quantity)
    material_weight <- material_total/day_total
    item[j] <- material_total/day_total
    
    
  }
}

如果您有任何建议,我们将不胜感激

这是您算法的 dplyr 版本:

library(dplyr)
inv %>%
  group_by(Date) %>%
  mutate(
    weight = Quantity / sum(Quantity),
  ) %>%
  summarize(
    result = sum(Quantity * weight)
  ) 
# # A tibble: 2 × 2
#   Date       result
#   <chr>       <dbl>
# 1 2020-01-01   80.5
# 2 2020-02-02   54.2

或者我们可以直接使用built-in weighted.mean函数得到同样的结果:

inv %>%
  group_by(Date) %>%
  summarize(
    result = weighted.mean(Quantity, w = Quantity / sum(Quantity))
  ) 

如果我误解了目标,请编辑您的问题以显示样本输入所需的输出。