javascript - Javascript按多个字段分组平均值和计数
问题描述
data = [
{
"index": 0,
"id": 47,
"sepallengthcm": 5.1,
"sepalwidthcm": 3.8,
"unnamed:_3": 1.6,
"petalwidthcm": 0.2,
"species": "setosa"
},
{
"index": 1,
"id": 48,
"sepallengthcm": 4.6,
"sepalwidthcm": 3.2,
"unnamed:_3": 1.4,
"petalwidthcm": 0.2,
"species": "setosa"
},
{
"index": 2,
"id": 49,
"sepallengthcm": 5.3,
"sepalwidthcm": 3.7,
"unnamed:_3": 1.5,
"petalwidthcm": 0.2,
"species": "jennifer"
},
{
"index": 3,
"id": 50,
"sepallengthcm": 5.0,
"sepalwidthcm": 3.3,
"unnamed:_3": 1.4,
"petalwidthcm": 0.2,
"species": "setosa"
},
{
"index": 4,
"id": 97,
"sepallengthcm": 12.0,
"sepalwidthcm": 2.9,
"unnamed:_3": 4.2,
"petalwidthcm": 1.3,
"species": "jennifer"
},
{
"index": 5,
"id": 98,
"sepallengthcm": 6.2,
"sepalwidthcm": 2.9,
"unnamed:_3": 4.3,
"petalwidthcm": 1.3,
"species": "jennifer"
},
{
"index": 6,
"id": 99,
"sepallengthcm": 5.1,
"sepalwidthcm": 2.5,
"unnamed:_3": 3.0,
"petalwidthcm": 1.1,
"species": "kajol"
},
{
"index": 7,
"id": 100,
"sepallengthcm": 11.0,
"sepalwidthcm": 2.8,
"unnamed:_3": 7.0,
"petalwidthcm": 1.3,
"species": "floaw"
},
{
"index": 8,
"id": 101,
"sepallengthcm": 6.3,
"sepalwidthcm": 3.3,
"unnamed:_3": 6.0,
"petalwidthcm": 2.5,
"species": "Iris-flower"
},
{
"index": 9,
"id": 102,
"sepallengthcm": 5.8,
"sepalwidthcm": 2.7,
"unnamed:_3": 5.1,
"petalwidthcm": 1.9,
"species": "Iris-flower"
}
]
这是我的输入
export const groupByMultiple = (arr, category, value1, value2) => {
let result = Object.values(arr.reduce(function(r, e) {
let key = e[category];
if (!r[key]) r[key] = e;
else {
let first_value = parseFloat(r[key][value1])
let second_value = parseFloat(r[key][value2])
first_value += parseFloat(e[value1]);
second_value += parseFloat(e[value2])
}
return r;
}, {}))
return result
}
groupByMultiple(data, "species", "sepallengthcm", "sepalwidthcm")
上面的函数通过聚合物种和对 sepallengthcm 和 sepalwidthcm 求和来给出总和。
我试图以同样的方式实现平均和计数。但是,不幸的是我的方法不起作用。
请看一下
谢谢..
上面的函数通过聚合物种和对 sepallengthcm 和 sepalwidthcm 求和来给出总和。
我试图以同样的方式实现平均和计数。但是,不幸的是我的方法不起作用。
请看一下
谢谢..
解决方案
您可以在 reduce 函数中为每个键添加新的键计数。然后使用结果数组,您可以调用 .map() 并计算 value1 和 value2 的平均值并将它们作为键添加到对象中,然后返回该对象,
data = [
{
"index": 0,
"id": 47,
"sepallengthcm": 5.1,
"sepalwidthcm": 3.8,
"unnamed:_3": 1.6,
"petalwidthcm": 0.2,
"species": "setosa"
},
{
"index": 1,
"id": 48,
"sepallengthcm": 4.6,
"sepalwidthcm": 3.2,
"unnamed:_3": 1.4,
"petalwidthcm": 0.2,
"species": "setosa"
},
{
"index": 2,
"id": 49,
"sepallengthcm": 5.3,
"sepalwidthcm": 3.7,
"unnamed:_3": 1.5,
"petalwidthcm": 0.2,
"species": "jennifer"
},
{
"index": 3,
"id": 50,
"sepallengthcm": 5.0,
"sepalwidthcm": 3.3,
"unnamed:_3": 1.4,
"petalwidthcm": 0.2,
"species": "setosa"
},
{
"index": 4,
"id": 97,
"sepallengthcm": 12.0,
"sepalwidthcm": 2.9,
"unnamed:_3": 4.2,
"petalwidthcm": 1.3,
"species": "jennifer"
},
{
"index": 5,
"id": 98,
"sepallengthcm": 6.2,
"sepalwidthcm": 2.9,
"unnamed:_3": 4.3,
"petalwidthcm": 1.3,
"species": "jennifer"
},
{
"index": 6,
"id": 99,
"sepallengthcm": 5.1,
"sepalwidthcm": 2.5,
"unnamed:_3": 3.0,
"petalwidthcm": 1.1,
"species": "kajol"
},
{
"index": 7,
"id": 100,
"sepallengthcm": 11.0,
"sepalwidthcm": 2.8,
"unnamed:_3": 7.0,
"petalwidthcm": 1.3,
"species": "floaw"
},
{
"index": 8,
"id": 101,
"sepallengthcm": 6.3,
"sepalwidthcm": 3.3,
"unnamed:_3": 6.0,
"petalwidthcm": 2.5,
"species": "Iris-flower"
},
{
"index": 9,
"id": 102,
"sepallengthcm": 5.8,
"sepalwidthcm": 2.7,
"unnamed:_3": 5.1,
"petalwidthcm": 1.9,
"species": "Iris-flower"
}
]
const groupByMultiple = (arr, category, value1, value2) => {
let result = Object.values(arr.reduce(function(r, e) {
let key = e[category];
if (!r[key]) r[key] = {...e, count: 1};
else {
let first_value = parseFloat(r[key][value1])
let second_value = parseFloat(r[key][value2])
first_value += parseFloat(e[value1]);
second_value += parseFloat(e[value2])
r[key][value1] = first_value;
r[key][value2] = second_value;
r[key]['count'] += 1;
}
return r;
}, {}));
return result.map(item => {
item[`average_${value1}`] = item[value1]/item.count;
item[`average_${value2}`] = item[value2]/item.count;
return item;
})
}
const ret = groupByMultiple(data, "species", "sepallengthcm", "sepalwidthcm");
console.log(ret);
推荐阅读
- reactjs - NextJS - 组件条件渲染出现重复 html ID 的问题
- sql - 在 on 子句中使用“and”进行自连接
- angular - 无法在 Ionic 4 项目中运行“ng add @angular/material”
- performance - 为什么 strconv.ParseUint 比 strconv.Atoi 慢?
- html - 如何防止用户使浏览器窗口比 HTML 和 CSS 中的预定义宽度窄?
- python - 使用透明背景保存 Matplotlib 表面图
- javascript - 无法检索用户的 mysite URL OneDrive 资源管理器 javascript 问题
- r - 如何将数据框中的所有整数 64 列转换为整数?
- stata - 修改所有可能的 stata ado 文件,使其接受任意数量的变量
- javascript - 使用 puppeteer 检测 DOM 中的变化 _ MutationObserver 正在工作