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

在R的data.table中按列使用不同权重计算加权均值

解决data.table中按不同权重列计算加权均值的问题

我来帮你搞定这个需求——你需要按id分组,对col_a、col_b用w_1做权重,col_c、col_d用w_2做权重计算加权均值。你之前尝试的Map写法之所以卡壳,是因为没办法把对应的权重参数传递给weighted.mean函数,我们可以通过两种方式解决:

方法一:用权重映射表灵活处理(适合列数较多的场景)

首先定义一个列-权重映射表,明确每个数值列对应的权重列,然后在分组计算时,通过Map把数值列和权重列配对,传入weighted.mean:

require(data.table)

# 你的示例数据
id <- c(1,1,1,2,2,2)
col_a <- c(123,56,87,987,1003,10)
col_b <- c(17,234,20,88,765,69)
col_c <- c(45,90,543,30,1,543)
col_d <- c(60,43,700,3,88,46)
w_1 <- c(1,1,1,1,1,1)
w_2 <- c(1.5,1,1.2,0.8,1,1)
dt <- data.table(id, col_a, col_b, col_c, col_d, w_1, w_2)

# 定义列与权重列的映射关系
weight_map <- list(
  col_a = "w_1",
  col_b = "w_1",
  col_c = "w_2",
  col_d = "w_2"
)

# 分组计算加权均值
result <- dt[, Map(function(col, w_col) {
  weighted.mean(.SD[[col]], .SD[[w_col]], na.rm = TRUE)
}, names(weight_map), unname(unlist(weight_map))), 
by = id, 
.SDcols = c(names(weight_map), unname(unlist(weight_map)))]

print(result)

代码解释:

  • weight_map:把需要计算的数值列和对应的权重列一一绑定,方便批量处理
  • Map(function(col, w_col) ...):同时遍历数值列名和权重列名,对每组的对应列计算加权均值
  • .SDcols:指定需要用到的列(数值列+权重列),避免加载不必要的列提升效率

方法二:直接指定列计算(适合列数较少的场景)

如果你的列不多,直接在j参数里逐个定义计算逻辑会更直观:

result <- dt[, .(
  col_a = weighted.mean(col_a, w_1, na.rm = TRUE),
  col_b = weighted.mean(col_b, w_1, na.rm = TRUE),
  col_c = weighted.mean(col_c, w_2, na.rm = TRUE),
  col_d = weighted.mean(col_d, w_2, na.rm = TRUE)
), by = id]

print(result)

验证结果

两种方法都会得到你期望的输出:

id     col_a     col_b     col_c     col_d
1:  1  88.66667  90.33333 218.67568 219.72973
2:  2 666.66667 274.00000 272.19048  46.09524

比如id=1的col_c加权均值计算:(45*1.5 + 90*1 + 543*1.2)/(1.5+1+1.2) = 809.1/3.7 ≈ 218.6757,和结果完全一致。

内容的提问来源于stack exchange,提问作者HannesZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:21:41