我有一个 CSV 文件,其中包含一段时间内出版的同人小说。它看起来像:
id,published_date,characters
1,2017-01-01,'['Joe','Bob','Mary']'
2,2017-01-02,'['Mary']'
3,2017-01-02,'['Bob','Mary']'
我在 published_date
之前编写了一个关键函数,但现在我想看看我是否可以为 characters
编写一个关键函数。因此,对于第一行,Joe、Bob 和 Mary 都是具有值 2017-01-01
的键,然后在第二行中是 2017-01-02
将被添加到 Mary 的 key 中。最后,我想在 published_date
上做一个 rollup
,以便统计每个日期出版的关于 Mary 的同人小说的数量。我认为最终数据看起来像这样:
{
Bob: {2017-01-01: 1}, {2017-01-02: 1},
Joe: {2017-01-01: 1},
Mary: {2017-01-01: 1}, {2017-01-02: 2}
}
所以对于 published_date
,我的代码如下所示:
var dates = d3.nest()
.key(function(d) { return parseDate(d.published_date); })
.rollup(function(v) { return v.length; })
.entries(csv_data);
如果我的 characters
列不是列表,那么我相信这会起作用:
var dates = d3.nest()
.key(function(d) { return d.characters; }) // key by character
.key(function(d) { return parseDate(d.published_date); })
.rollup(function(v) { return v.length; })
.entries(csv_data);
有没有办法可以更改 key(function(d) { return d.characters; })
以实际创建多个键?
谢谢!
最佳答案
分解数据,您就得到了正确的答案。
var csv = `id,published_date,characters
1,2017-01-01,"[Joe,Bob,Mary]"
2,2017-01-02,"[Mary]"
3,2017-01-02,"[Bob,Mary]"`;
var csvData = d3.csvParse(csv, function(r) {
return {
id: +r.id,
publishedDate: new Date(r.published_date),
characters: r.characters.slice(1,-1).split(",")
};
});
var data = [];
csvData.forEach(function(r) {
r.characters.forEach(function(c) {
data.push({
id: r.id,
publishedDate: r.publishedDate,
character: c
});
});
});
现在这应该按照您希望的方式工作。
var nested = d3.nest()
.key(function(d) { return d.character; })
.key(function(d) { return d.publishedDate; })
.rollup(function(v) { return v.length })
.entries(data);
关于javascript - d3 的 key 函数可以处理列表元素吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45614741/