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

如何按ndc_description和year分组计算均值并赋值到原数据数组?

分组计算均值并赋值回原数组

问题背景

给定如下数据:

const data = [
  {ndc_description: "VIAGRA 50 MG TABLET", new_percent_change: 12.9, year: "2017"}, 
  {ndc_description: "VIAGRA 50 MG TABLET", new_percent_change: 12.9, year: "2019"}, 
  {ndc_description: "VIAGRA 50 MG TABLET", new_percent_change: 12.9, year: "2017"}, 
  {ndc_description: "JANUVIA 100 MG TABLET", new_percent_change: 4.41, year: "2017"},
  {ndc_description: "JANUVIA 100 MG TABLET", new_percent_change: 4.41, year: "2019"},
  {ndc_description: "JANUVIA 100 MG TABLET", new_percent_change: 4.41, year: "2017"}
];

需求是按ndc_description和year分组,计算每组new_percent_change的均值,并在原数组的每个对象中新增一列存储该均值。

已通过以下代码计算出分组均值:

const roll = d3.rollups(data, v => d3.mean(v, d => d.new_percent_change), d => d.year, d => d.ndc_description);

解决方案

d3.rollups返回嵌套数组结构([year, [ndc_description, mean]]),我们可以先把它转换成便于查询的映射结构,再遍历原数据数组给每个元素添加均值字段。

方法1:转换为嵌套Map

// 将rollups结果转为嵌套Map:year -> ndc_description -> mean
const meanMap = new Map(roll.map(([year, ndcEntries]) => 
  [year, new Map(ndcEntries)]
));

// 遍历原数据,新增group_mean字段存储均值
data.forEach(d => {
  d.group_mean = meanMap.get(d.year).get(d.ndc_description);
});

方法2:转换为平面对象

// 将rollups结果转为平面对象,用`year-ndc_description`作为键
const meanObj = {};
roll.forEach(([year, ndcEntries]) => {
  ndcEntries.forEach(([ndc, mean]) => {
    meanObj[`${year}-${ndc}`] = mean;
  });
});

// 遍历原数据添加字段
data.forEach(d => {
  d.group_mean = meanObj[`${d.year}-${d.ndc_description}`];
});

执行后,原data数组中的每个对象都会新增group_mean字段,对应分组的均值会被赋值进去。比如所有VIAGRA 50 MG TABLET且year=2017的对象,group_mean值为12.9;JANUVIA 100 MG TABLET且year=2019的对象,group_mean值为4.41。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:10:46