提问人:Leonard Zhang 提问时间:11/17/2023 更新时间:11/18/2023 访问量:55
在 R 中,列表中所有数据帧中一列的加权平均值
In R, weighted average of one column among all dataframes in a list
问:
假设我有一个数据帧列表。每个数据帧包含相同的列(性别、年龄、薪水),但包含不同的行(您可以将其视为每个实验中具有不同参与者的实验结果列表)。数据帧的大小相同 (100 x 9)。现在,我有一个权重向量,其长度与数据帧列表的长度相同。我想生成另一个数据帧,该数据帧显示这些数据帧中工资和年龄的加权平均值。例如,工资的加权平均值 = (权重 1 * 数据帧 1 中的工资列 + 权重 2 * 数据帧 2 中的工资列 + ...) / (权重 1 + 权重 2 + ...)。最终结果是与工资列大小相同的向量。
谁能就如何实现这一目标提供建议?非常感谢!
我尝试了不同的方法,但没有任何效果。
答:
0赞
Friede
11/17/2023
#1
(1) 对于列表中的每个数据框,计算“工资”和“年龄”的列均值。(2) 通过数据帧特定权重(标量)对这些均值进行加权。(三)上报结果。实现此目的的众多方法之一:
玩具数据:
set.seed(1)
# generate some purely random values
ls_df <- list(df1 = data.frame(salary = rnorm(10L, 2000L, 700L),
age = rnorm(10L, 41L, 6L)),
df2 = data.frame(salary = rnorm(10L, 3000L, 800L),
age = rnorm(10L, 52L, 4L)))
w <- c(.6, .4)
我想生成另一个数据帧,该数据帧显示这些数据帧中工资和年龄的加权平均值。
df_out <-
lapply(X = ls_df,
FUN = \(x) colMeans(x = x[, c("salary", "age")], na.rm = TRUE)) |>
list2DF() |>
`rownames<-`(c("salary", "age")) |>
sweep(MARGIN = 2L, STATS = w, FUN = "*") |> # w / sum(w)
round(digits = 2L)
这给出了:
> df_out
df1 df2
salary 1255.53 1157.22
age 25.50 20.99
如果要乘以 w_1 / (w_1 + w_2),则替换为 inside of 。显然,对于 0.6 + 0.4 = 1,没有任何变化。w
w / sum(w)
sweep()
如果您希望结果是每个变量的数值向量,只需键入 和 。salaray <- as.numeric(df_out[1L, ])
age <- as.numeric(df_out[2L, ])
评论
0赞
Leonard Zhang
11/18/2023
非常感谢您的评论。但我不希望年龄成为体重。因此,为了建立您的回复,我们有两个数据帧的薪水和年龄列。第一个数据帧有一个权重(比如 0.6),第二个数据帧的另一个权重(比如 0.4)。权重由向量 w <- c(0.6, 0.4) 存储。我想在第一个和第二个数据帧中取工资的权重平均值。结果将是一个向量,我们将其存储在另一个数据帧中。我们也这样做。最终结果将是另一个包含薪水和年龄的数据帧。希望它能澄清。
0赞
Friede
11/18/2023
请参阅我最近的更新。
评论