我正在努力接近/理解如何使用当前代码对数据进行分组。
最终目标是创建一个密度图,其密度沿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 !== "";
});
答案 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文件,否则您需要这样做。