javascript - 计算某些键的值与平均值的标准差多少

标签 javascript d3.js data-manipulation

我在 Javascript/React 中使用包含运动数据的对象数组。

这是我正在处理的数据示例:

const mydata = [
  { name: "Tom", year: 2018, statA: 23.2, statB: 12.3 },
  { name: "Bob", year: 2018, statA: 13.2, statB: 10.1 },
  { name: "Joe", year: 2018, statA: 18.2, statB: 19.3 },
  { name: "Tim", year: 2018, statA: 21.1, statB: 21.3 },
  { name: "Jim", year: 2018, statA: 12.5, statB: 32.4 },
  { name: "Nik", year: 2017, statA: 23.6, statB: 23.8 },
  { name: "Tre", year: 2017, statA: 37.8, statB: 18.3 },
  { name: "Ton", year: 2017, statA: 15.3, statB: 12.1 },
  { name: "Bil", year: 2017, statA: 32.2, statB: 41.3 },
  { name: "Geo", year: 2017, statA: 21.5, statB: 39.8 }
];

我这里的数据操作问题感觉非常具有挑战性,我正在苦苦挣扎。我需要按年缩放(即 0,stdev 1)数据中的每个键(statA、statB)。

例如,查看 statA 列中 year === 2018 的值,我们有 [23.2, 13.2, 18.2, 21.1, 12.5]。作为测试,将此向量插入 R 的 scale() 函数会得到以下结果:

scale(c(23.2, 13.2, 18.2, 21.1, 12.5))

           [,1]
[1,]  1.1765253
[2,] -0.9395274
[3,]  0.1184989
[4,]  0.7321542
[5,] -1.0876511
attr(,"scaled:center")
[1] 17.64
attr(,"scaled:scale")
[1] 4.72578 

...所以在我原来的对象数组中,第一个对象中的值 statA: 23.2 应该更新为 1.1765,因为值 23.2 比 Year == 2018 的所有其他 statA 值的平均值高出 1.1765 个标准差. 在我的完整数据集中,我有约 8K 个对象和每个对象中的约 50 个键,其中约 40 个我需要按年缩放。

在高层次上,我认为我必须(1)计算每年每个统计数据的均值和标准偏差,(2)使用该年份该统计数据的均值和标准偏差,并将其映射到它的缩放值。性能/速度对我的应用程序很重要,我担心普通的 for 循环会非常慢,尽管这是我目前正在尝试的。

感谢任何帮助!

编辑 2:

在我通读/编写代码之前,想发布我昨天完成的内容:

    const scaleCols = ['statA', 'statB'];
    const allYears = [...new Set(rawData.map(ps => ps.Year))];

    // loop over each year of the data
    for(var i = 0; i < allYears.length; i++) {

        // compute sums and counts (for mean calc)
        thisYearsArray = rawData.filter(d => d.Year === allYears[i])
        sums = {}, counts = {};
        for(var j = 0; j < thisYearsArray.length; j++) {
            for(var k = 0; k < scaleCols.length; k++) {
                if(!(scaleCols[k] in sums)) {
                    sums[scaleCols[k]] = 0;
                    counts[scaleCols[k]] = 0;
                }

                sums[scaleCols[k]] += thisYearsArray[j][scaleCols[k]];
                counts[scaleCols[k]] += 1;
            }
        }

        console.log('sums', sums)
        console.log('counts', counts)
    }

...就像我说的不太好。

编辑:使用 d3 的缩放函数对此有帮助吗?

最佳答案

作为一名 D3 程序员,我很高兴看到 other answer 使用 D3 比例(特别是因为这个问题最初没有用 标记)。但是,作为 answerer already hinted ,您在这里不需要 D3 刻度,这是一种矫枉过正。

你只需要 (value - mean) / deviation :

var result = arr.map(d => (d - mean) / deviation);

这是演示:

var arr = [23.2, 13.2, 18.2, 21.1, 12.5];
var deviation = d3.deviation(arr)
var mean = d3.mean(arr)

var result = arr.map(d => (d - mean) / deviation);

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

除此之外,还有两个注意事项:

  1. “在高层次上,我认为我必须(第一)计算每年每个统计数据的平均值和标准偏差,并且(第二)使用该年份该统计数据的平均值和标准偏差” :没错,在知道标准差和均值之前,你无法计算出一个值与均值的标准差多少,只能先循环整个数组才能知道。因此,您不可能对数据数组进行少于 2 次的迭代。
  2. “性能/速度对我的应用很重要,我担心普通的 for 循环会很慢”:现在情况有点不同,但直到最近,没有什么能比 for关于性能的循环。因此,您所谓的普通循环通常是最快的解决方案。

关于javascript - 计算某些键的值与平均值的标准差多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52398668/

相关文章:

javascript - 迭代 JSON 对象并将元素打印到屏幕的最佳方法是什么?

javascript - 如何为文本区域创建正则表达式?

javascript - 确定在 react 中选中的复选框的方法(useState)

javascript - D3 给我一个 d3.selectAll() 语法错误

javascript - D3 中的并发转换(循环遵循填充路径)

javascript - 如何在 d3js 中更新分组条形图

javascript - 如何正确管理 Sinatra 网页中的输入

python - 将日期分配给下面的所有行,直到下一个日期

xml - 您如何处理 fetchxml 结果数据?

java - 如何从 Java 中的数组中删除对象?