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

如何为嵌套分组的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:50:39