You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用across实现基于另一tibble权重的列加权平均新增列

加权平均值列实现方案

直接用dplyr的across函数就能搞定,还能灵活适配任意列选择的场景,步骤如下:

  1. 先把权重表w转成命名向量,让列名和权重一一对应,方便后续匹配:
weights_vec <- tibble::deframe(w)
  1. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 05:50:00