在CSV文件中对数据进行分组

时间:2019-05-23 12:41:33

标签: javascript

我正在努力接近/理解如何使用当前代码对数据进行分组。

最终目标是创建一个密度图,其密度沿x轴为数十,然后为沿y轴的出现数。数据清理完数据集后,看起来像这样:

name,sex,first_appearence,franchise
Wonder Woman (Diana Prince),Female,1941,DC
Dinah Laurel Lance,Female,1969,DC
GenderTest,Female,1956,DC
Barbara Gordon,Female,1967,DC
Lois Lane,Female,1938,DC

我希望能够在csv文件中添加另一列,它将该行分配给十年。例如,第一行将在组1940中,第二行将在组1960中,依此类推。

这是我当前清除要更新的数据的代码,以便将数据分组为几十年:

var data = CSV.map(function(d) {
    return {
        name: d.name.replace(" (New Earth)", "").replace(" (Earth-One)", "").replace(" (Earth-Two)", "").replace(" (Earth-3)", ""),
        sex: d.SEX.replace(" Characters", ""),
        first_appearence: d.YEAR,
        franchise: "DC"
    }
});
females = data.filter(function (d) {
    return d.sex === "Female" && d.first_appearence !== "";
});

2 个答案:

答案 0 :(得分:0)

您可以使用d3.nest()按十年对数据进行分组。要将first_appearance转换为十进制,只需将其除以10,将其舍入为最接近的整数,然后再乘以10,就可以得到如下数据转换:

      /10          round down        *10
1965 —————→ 196.5 ————————————→ 196 —————→ 1960

因此,您与.key一起使用的d3.nest()将是根据first_appearance的值计算的转换后的十年:

var dataByDecade = d3.nest()
  .key(function(d) { return Math.floor(d.first_appearance / 10) * 10; })
  .entries(data);

如果您的年份未转换为数字,请记住使用+运算符将字符串转换为数字,例如first_appearence: +d.YEAR解析CSV时。当然,您也可以在执行分组时在该步骤进行操作,即

var dataByDecade = d3.nest()
  .key(function(d) { return Math.floor(+d.first_appearance / 10) * 10; })
  .entries(data);

请参见下面的概念验证:

var data = [{
	name: 'Dinah Laurel Lance',
	sex: 'Female',
	first_appearance: 1969,
	franchise: 'DC'
},
{
	name: 'GenderTest',
	sex: 'Female',
	first_appearance: 1956,
	franchise: 'DC'
},
{
	name: 'Barbara Gordon',
	sex: 'Female',
	first_appearance: 1967,
	franchise: 'DC'
},
{
	name: 'Lois Lane',
	sex: 'Female',
	first_appearance: 1938,
	franchise: 'DC'
}];

var dataByDecade = d3.nest()
  .key(function(d) { return Math.floor(d.first_appearance / 10) * 10; })
  .entries(data);
  
console.log(dataByDecade);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>


更新:您似乎不想对数据进行分组,而是附加了包含十年数据的列。可以这样做:

var data = CSV.map(function(d) {
    return {
        name: d.name.replace(" (New Earth)", "").replace(" (Earth-One)", "").replace(" (Earth-Two)", "").replace(" (Earth-3)", ""),
        sex: d.SEX.replace(" Characters", ""),
        first_appearence: d.YEAR,
        decade: Math.floor(+d.YEAR / 10) * 10;
        franchise: "DC"
    }
});

答案 1 :(得分:0)

如果我正确理解了您的问题,则可以将列添加到CSV.map函数中,如下所示:

var data = CSV.map(function(d) {
return {
    name: d.name.replace(" (New Earth)", "").replace(" (Earth-One)", "").replace(" (Earth-Two)", "").replace(" (Earth-3)", ""),
    sex: d.SEX.replace(" Characters", ""),
    first_appearence: d.YEAR,
    franchise: "DC",
    decade: d.YEAR - (d.YEAR % 10)
}
});

这会将年份设置为十年,并减去一位数字年份(使用modulus)。我假设您将CSV.map的结果另存为CSV文件,否则您需要这样做。