在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
相关产品推荐
相关产品推荐

