从多个数组返回摘要统计信息

时间:2019-12-29 03:48:53

标签: javascript d3.js

我有一个对象数组。我想从2个以上的数组中获取键值对象的map(?),而不仅仅是一个。以下代码是从d3.js开始的标准嵌套。但是,我不是让 Species 作为键,而是要让 Sepal_Length,Sepal_Width,Petal_Length,Petal_Width中的每一个成为键,并且将值设为array[q1,q2,q3,iqr,min,max]

sumDat = {
  var sumstat = d3.nest() 
    .key(function(d) { return d.Species;})
    .rollup(function(d) {
      var q1 = d3.quantile(d.map(g => g.Sepal_Length).sort(d3.ascending),.25)
      var median = d3.quantile(d.map(g => g.Sepal_Length).sort(d3.ascending),.5)
      var q3 = d3.quantile(d.map(g => g.Sepal_Length).sort(d3.ascending),.75)
      var iqr = q3 - q1
      var min = q1 - 1.5 * iqr
      var max = q3 + 1.5 * iqr
      return({q1: q1, median: median, q3: q3, interQuantileRange: iqr, min: min, max: max})
    })
    .entries(dd1)
  return sumstat
}

链接我可观察的notebook。向下滚动到sumDat单元格。

1 个答案:

答案 0 :(得分:2)

我假设您想要以下输出:

newsumData = Array(4) [
  0: Object {
      key: "Sepal_Length"
      values: 
      Array(6) [5.1, 5.8, 6.4, 1.3000000000000007, 3.1499999999999986, 8.350000000000001]
     }
  1: Object {key: "Sepal_Width", values: Array(6)}
  2: Object {key: "Petal_Length", values: Array(6)}
  3: Object {key: "Petal_Width", values: Array(6)}
]

为此,

  1. 创建一个单独的函数来计算值,并以所需的格式给出输出,如下所示:
function calculateValues(d, key){
  var q1 = d3.quantile(d.map(g => g[key]).sort(d3.ascending),.25)
  var median = d3.quantile(d.map(g => g[key]).sort(d3.ascending),.5)
  var q3 = d3.quantile(d.map(g => g[key]).sort(d3.ascending),.75)
  var iqr = q3 - q1
  var min = q1 - 1.5 * iqr
  var max = q3 + 1.5 * iqr
  return {key: key, values: [q1,median,q3,iqr,min,max]};
}
  1. 创建要嵌套的键的数组。可以手动输入或从数据集中推导得出。在这种情况下,让我们这样手动键入它:
var dataKeys = ["Sepal_Length", "Sepal_Width", "Petal_Length", "Petal_Width"]
  1. 使用dataKeys数组上的映射最后计算最终数据结构,如下所示:
newsumData = dataKeys.map(m => calculateValues(dd1, m));

Observable Notebook