如何按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
相关产品推荐
相关产品推荐

