按组查找最近的日期和输出值
Posted
技术标签:
【中文标题】按组查找最近的日期和输出值【英文标题】:Find the most recent date and output value by group 【发布时间】:2018-07-20 18:14:09 【问题描述】:我只想显示每个组的最新值。
以下 CSV 示例:肉桂葡萄干品种的百吉饼总量是在三个不同的采样期收集的:2017 年 5 月、2017 年 3 月和 2016 年 11 月,它们的数量分别为:300、100 和 20。
我已经获取了年份和月份,将它们组合起来,并将它们转换为数字格式,这样我就可以执行 d3.max 来定位最近(最高)的值。最高的是 42856(2017 年 5 月),但我想显示金额(300)而不是 d3.max 金额。
breakfastItem,gluten,breakfastItemType,month,year,dateCode,value
Bagel,Yes,Cinnamon Raisin,May,2017,42856,300
Bagel,Yes,Cinnamon Raisin,March,2017,42795,100
Bagel,Yes,Cinnamon Raisin,November,2016,42675,20
Bagel,Yes,Blueberry,February,2017,42767,50
Bagel,Yes,Blueberry,November,2016,42675,30
Bagel,Yes,Blueberry,March,2016,42430,100
Bagel,Yes,Plain,February,2018,43132,200
Bagel,Yes,Plain,December,2017,43070,202
Bagel,Yes,Plain,February,2016,42401,201
这是我的 javascript:
d3.csv("Breakfast.csv",function(data)
data.forEach(function(d)
d.value = +d.value;
d.year = +d.year;
d.dateCode = +d.dateCode;
);
var breakfastCombinations = d3.nest()
.key(function(d) return d.breakfastItem; )
.key(function(d) return d.breakfastItemType; )
.rollup(function(oldestDate)
return d3.max(oldestDate, function(d)
return d.dateCode; );
)
.entries(data);
document.getElementById("breakfastjson").innerhtml = JSON.stringify(breakfastCombinations,false,2);
);
将我的 JSON 弹出为
"key": "Bagel",
"values": [
"key": "Cinnamon Raisin",
"value": 42856
,
"key": "Blueberry",
"value": 42767
,
"key": "Plain",
"value": 43132
]
但我希望“价值”是该类型百吉饼的总量,而不是 dateCode。像这样:
"key": "Bagel",
"values": [
"key": "Cinnamon Raisin",
"value": 300
,
"key": "Blueberry",
"value": 50
,
"key": "Plain",
"value": 200
]
我想使用此 dateCode 来识别要显示的许多不同信息(如月、年等)的信息。我试过这样的组合:
.rollup(function(oldestDate)
return d3.max(oldestDate, function(d)
return d.dateCode; ).value;
)
和
.rollup(function(oldestDate)
return d3.max(oldestDate, function(d)
return d.dateCode.value; );
)
但我似乎找不到正确的语法来显示它。救命!
【问题讨论】:
【参考方案1】:你只需要对对象数组oldestDate
进行排序,得到第一个的value
属性,它是最高的:
.rollup(function(oldestDate)
return oldestDate.sort(function(a, b)
return b.dateCode - a.dateCode
)[0].value
);
这里是演示:
var csv = `breakfastItem,gluten,breakfastItemType,month,year,dateCode,value
Bagel,Yes,Cinnamon Raisin,May,2017,42856,300
Bagel,Yes,Cinnamon Raisin,March,2017,42795,100
Bagel,Yes,Cinnamon Raisin,November,2016,42675,20
Bagel,Yes,Blueberry,February,2017,42767,50
Bagel,Yes,Blueberry,November,2016,42675,30
Bagel,Yes,Blueberry,March,2016,42430,100
Bagel,Yes,Plain,February,2018,43132,200
Bagel,Yes,Plain,December,2017,43070,202
Bagel,Yes,Plain,February,2016,42401,201`;
var data = d3.csvParse(csv, function(d)
d.value = +d.value;
d.year = +d.year;
d.dateCode = +d.dateCode;
return d;
);
var breakfastCombinations = d3.nest()
.key(function(d)
return d.breakfastItem;
)
.key(function(d)
return d.breakfastItemType;
)
.rollup(function(oldestDate)
return oldestDate.sort(function(a, b)
return b.dateCode - a.dateCode
)[0].value
)
.entries(data);
console.log(breakfastCombinations)
<script src="https://d3js.org/d3.v4.min.js"></script>
【讨论】:
效果很好,这正是我所需要的。谢谢!以上是关于按组查找最近的日期和输出值的主要内容,如果未能解决你的问题,请参考以下文章