跨多个数组,在给定索引处获取所有元素的平均值

3
我有大约300个数组,每个数组都有100个x和y值的数组。我想获得一个包含300个数组中100个y值平均值的数组。怎样才能最好地实现这一点?我相信我应该使用某种类型的reduce函数,但是有点迷茫。
以下是我目前的代码:
let yval = cohort.map((d, i) => {
    let bin = d3.nest()
        .key(function(d) {
            return i;
        })
        .rollup(function(d) {
            return d;
        })
        .entries(d);

    return bin;
});

console.log(yval);

“cohort” 是一个对象数组。我想要隔离每个 cohort 对象中的“bins”数组。每个数组都有117个元素。对于每个 bins[i],我想从所有 bins 中获取 [i] 的平均值。基本上,我想把 300 个长度为 117 的数组转换成一个长度为 117 的平均数数组。任何帮助都将不胜感激!
3个回答

5

D3已经有一个名为d3.mean的方法,它:

返回给定数字数组的平均值

因此,如果您想获得每个内部数组的平均值,您只需要这样做(其中data是您的原始数组):

var arrayOfMeans = data.map(d => d3.mean(d));

这是一个基本演示:

var data = [
  [1, 2, 3, 4, 5],
  [10, 20, 30, 40, 50],
  [100, 200, 300, 400, 500]
];

var arrayOfMeans = data.map(d => d3.mean(d));

console.log(arrayOfMeans)
<script src="https://d3js.org/d3.v5.min.js"></script>

然而,您的数据结构现在不是很清晰:片段上方的描述(“我大约有300个数组,每个数组都有100个x和y值的数组”)与片段下方的描述(“'cohort'是一个对象数组。我想隔离每个队列对象中的'bins'数组。每个这些都有117个元素。”)不同! 这非常令人困惑...
因此,假设您有一个数组的数组,并且在每个内部数组中有两个值 [x,y] ,则可以如下使用 d3.mean 计算两个平均值,一个用于 x 值,另一个用于 y 值:
var arrayOfMeans = [d3.mean(data.map(d => d[0])), d3.mean(data.map(d => d[1]))];

或者,如果你不喜欢字面量:

var arrayOfMeans = d3.range(2).map(d => d3.mean(data.map(e => e[d])));

这里是演示:

var data = [
  [1, 100],
  [2, 200],
  [3, 300]
];

var arrayOfMeans = [d3.mean(data.map(d => d[0])), d3.mean(data.map(d => d[1]))]

console.log(arrayOfMeans)
<script src="https://d3js.org/d3.v5.min.js"></script>


嘿,谢谢你的帮助!数据结构有点奇怪。我正在使用集合在单独的可视化中,所以我正在提取该数据的子集来用于此次操作。现在我正在测试一些选项,但我会进行一些修改。再次感谢! - Sockness_Rogers

0

如何在JS中计算数组的平均值已经有了答案:

使用JS找到数组的平均值

您可以使用该答案中定义的函数,并将其映射到数组的数组上。例如:

var result = cohort.map(cohortElement => cohortElement.bin).map(/*function declared in other StackOverflow answer*/)

0

为了实现预期的效果,请使用以下 ForEach 和数组 reduce 方法选项

  1. 首先使用 array.ForEach 方法创建循环以处理 300 个数组

  2. 在每个数组的循环内部,我使用 reduce 方法来查找平均值

var sampleArr = [];// sample array for testing 
var meanList = [];// final Mean list array
for (var i=0; i< 301; i++){
  sampleArr[i] =[]
   for (var j=0; j< 2; j++){
   sampleArr[i].push({
     x:i,
     y:i+1
   })
}
}

getMean = arr => {
  arr.forEach(e => {
    let sum = e.reduce(function(a, c) {
      console.log(a, c);
      return a.y + c.y;
    });
    meanList.push(sum / e.length);
  });
};

getMean(sampleArr)

console.log(meanList);

我创建了一个长度为300的示例数组,每个数组都有2个用于测试的数组。
代码示例 - https://codepen.io/nagasai/pen/eMXNMZ?editors=1010

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接