如何使用 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 多个项目和日期。
- 首先我对一天的数据进行子集化
- 汇总当天所有商品数量
- 将每个项目数量除以总和(来自上一步),我们称结果为权重
- 将每件商品的数量乘以相应的重量,然后将每件商品的结果相加。
- 将第 4 步的结果除以所有权重的总和。
- 重复所有天数。
示例的结果应该是:
- 首先是 2020-01-01 日的所有项目
- 10 + 100 + 20 + 80 = 210
- 10/210 = 0.048、100/210 = 0.48、20/210 = 0.095、80/210 = 0.38
- 10 * 0.048 + 100 * 0.48 + 20 * 0.095 + 80 * 0.38 = 0.48 + 48 + 1.9 + 30.4 = 80.78
- 80.78/(0.048 + 0.48 + 0.095 + 0.38) = 80.78/1.003 = 80.54
- 与 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))
)
如果我误解了目标,请编辑您的问题以显示样本输入所需的输出。
我将从一个例子开始:
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 多个项目和日期。
- 首先我对一天的数据进行子集化
- 汇总当天所有商品数量
- 将每个项目数量除以总和(来自上一步),我们称结果为权重
- 将每件商品的数量乘以相应的重量,然后将每件商品的结果相加。
- 将第 4 步的结果除以所有权重的总和。
- 重复所有天数。
示例的结果应该是:
- 首先是 2020-01-01 日的所有项目
- 10 + 100 + 20 + 80 = 210
- 10/210 = 0.048、100/210 = 0.48、20/210 = 0.095、80/210 = 0.38
- 10 * 0.048 + 100 * 0.48 + 20 * 0.095 + 80 * 0.38 = 0.48 + 48 + 1.9 + 30.4 = 80.78
- 80.78/(0.048 + 0.48 + 0.095 + 0.38) = 80.78/1.003 = 80.54
- 与 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))
)
如果我误解了目标,请编辑您的问题以显示样本输入所需的输出。