我正在尝试使用csv文件的值总和来获取组,但我想删除所有零值。
我的csv文件示例:
Continents Function Value
South Asia Function1
South Asia Function2 14
Europe Function1
Europe Function2 12
Europe Function3 2
我想要
{"key":"Function2","value":26},
{"key":"Function3","value":2}
这是我的代码:
var ndx = crossfilter( csv );
var functions = ndx.dimension( function( d )
{
return d["Function"];
} );
var functionAmountGroup = functions.group().reduceSum( function ( d )
{
return d3.format( ".2f" )( d["Value"] );
} );
我得到了
{"key":"Function2","value":26},
{"key":"Function3","value":2},
{"key":"Function1","value":0}
但由于零值,我想删除“Function1”行。
我尝试使用值维度进行过滤,这没关系
var filterValues = ndx.dimension(
function( d )
{
return d["Value"];
} ).filter(
function( d )
{
if( 0 < Math.abs( d ) )
return d;
} );
这让我很好:
{"Continents":"Europe","Function":"Function3","Value":"2"},
{"Continents":"South Asia","Function":"Function2","Value":"14"},
{"Continents":"Europe","Function":"Function2","Value":"12"}
但filterValues现在是一个维度,然后我不知道如何通过这些过滤结果获得带有“功能”的新维度。
像
filteredValues.dimension( function( d )
{
return d["Function"];
} );
哪个错了!
是的,有人能帮帮我吗?我没有更多的想法! 非常感谢,答案 0 :(得分:7)
请创建一个jsFiddle。我不相信你发布的代码就像你说的那样,并且一个工作的例子将解决这个问题。具体做法是:
var filterValues = ndx.dimension(
function( d )
{
return d["Value"];
} ).filter(
function( d )
{
if( 0 < Math.abs( d ) )
return d;
} );
返回维度,而不是记录列表。
回答你的问题:如果你这样做,functionAmountGroup.top(Infinity)应该可以提供你想要的东西。
var ndx = crossfilter( csv );
var functions = ndx.dimension( function( d ) {
return d["Function"];
} );
var functionAmountGroup = functions.group().reduceSum( function ( d ) {
return d3.format( ".2f" )( d["Value"] );
} );
var filterValues = ndx.dimension(
function( d ) {
return d["Value"];
} ).filter(
function( d ) {
if( 0 < Math.abs( d ) )
return d;
} );
对新维度的.filter()调用将调整在另一维度上定义的functionAmountGroup。
您也可以这样做:
var ndx = crossfilter( csv );
var functions = ndx.dimension( function( d ) {
return d["Function"];
} );
var functionAmountGroup = functions.group().reduceSum( function ( d ) {
return d3.format( ".2f" )( d["Value"] );
} );
functionAmountGroup.top(Infinity).filter( function (d) { return d.value !== 0; } );
编辑:这不起作用。您实际上需要创建一个预过滤的伪Crossfilter组并将其传递给dc.js.像这样:
var filteredFunctionAmountGroup = {
all: function () {
return functionAmountGroup.top(Infinity).filter( function (d) { return d.value !== 0; } );
}
}