如何用across实现基于另一tibble权重的列加权平均新增列
加权平均值列实现方案
直接用dplyr的across函数就能搞定,还能灵活适配任意列选择的场景,步骤如下:
- 先把权重表
w转成命名向量,让列名和权重一一对应,方便后续匹配:
weights_vec <- tibble::deframe(w)
- 用
mutate新增AVG列,借助across遍历目标列,每列乘以对应权重后,用rowSums算出每行的加权和(也就是加权平均值,因为权重和为1):
db <- db %>% dplyr::mutate(AVG = rowSums(across(all_of(names(weights_vec)), ~ .x * weights_vec[cur_column()])))
扩展性说明
- 如果只想计算部分列的加权平均,比如只算
a和b,要么修改w表的col只保留这两个列名,要么在across里直接指定列(比如across(c(a, b), ...)),代码会自动匹配对应权重。 - 之后新增列的话,只要在
w表加对应的列名和权重,不用改代码就能直接用。
完整可运行代码
library(tibble) library(dplyr) # 原始数据 db = tibble(a = rnorm(1000), b = rnorm(1000), c = rnorm(1000)) w = tibble(col = c("a","b","c"), w = c(.4,.4,.2)) # 转换权重为命名向量 weights_vec <- deframe(w) # 计算加权平均并新增AVG列 db <- db %>% mutate(AVG = rowSums(across(all_of(names(weights_vec)), ~ .x * weights_vec[cur_column()])))
内容的提问来源于stack exchange,提问作者GiulioGCantone
相关产品推荐
相关产品推荐

