如何为嵌套分组的iris数据集添加分组专属权重进行加权计算
问题说明
已实现对iris数据集按Species嵌套后,为不同前缀的列计算加权均值:
- 以
Sepal开头的列使用权重c(0.20, 0.30) - 以
Petal开头的列使用权重c(0.25, 0.35)
现在需要为每个Species分组添加专属额外权重:setosa对应0.15,versicolor对应0.20,virginica对应0.25,让最终的加权计算结合该分组权重,示例逻辑如下:
setosa组的Sepal相关计算:
0.15 * (0.20*Sepal.Length + 0.30*Sepal.Width)
versicolor组的Sepal相关计算:0.20 * (0.20*Sepal.Length + 0.30*Sepal.Width)
现有列级加权的代码:
iris %>% group_by(Species) %>% nest(.) %>% ungroup %>% mutate(data = map(data, ~ .x %>% transmute( Sepal = apply(across(starts_with('Sepal')), 1, function(x) weighted.mean(x, c(0.20, 0.30))), Petal = apply(across(starts_with('Petal')), 1, function(x) weighted.mean(x, c(0.25, 0.35))) )))
解决方案
核心思路是将分组专属权重与嵌套后的数据集绑定,再用map2同时遍历数据和对应权重,完成结合分组权重的计算:
完整代码示例
library(tidyverse) # 定义每个Species对应的专属权重 group_weights <- tibble( Species = c("setosa", "versicolor", "virginica"), weight = c(0.15, 0.20, 0.25) ) # 嵌套数据并绑定分组权重,完成加权计算 iris %>% group_by(Species) %>% nest() %>% ungroup() %>% left_join(group_weights, by = "Species") %>% mutate(data = map2(data, weight, ~ .x %>% transmute( # 结合列级权重与分组权重计算Sepal最终值 Sepal_weighted = apply(across(starts_with("Sepal")), 1, function(x) weighted.mean(x, c(0.20, 0.30)) ) * .y, # 结合列级权重与分组权重计算Petal最终值 Petal_weighted = apply(across(starts_with("Petal")), 1, function(x) weighted.mean(x, c(0.25, 0.35)) ) * .y ))) %>% # 可选:取消嵌套查看完整结果 unnest(data)
关键逻辑说明
group_weights:单独定义分组权重,避免硬编码,后续修改权重只需调整此表left_join:将分组权重与嵌套数据关联,确保每个分组能匹配到对应的专属权重map2(data, weight, ~ ...):同时遍历每个分组的数据集和权重,.y代表当前分组的专属权重值,直接与列级加权结果相乘得到最终值
内容的提问来源于stack exchange,提问作者Dollar Tune-bill
相关产品推荐
相关产品推荐

