Crossfilter:如何从组中删除或过滤值

van*_*ssa 6 javascript crossfilter

我正在尝试使用csv文件的值总和来获取组,但我想删除所有零值.

我的csv文件示例:

Continents      Function      Value  
South Asia      Function1   
South Asia      Function2     14  
Europe          Function1   
Europe          Function2     12  
Europe          Function3     2
Run Code Online (Sandbox Code Playgroud)

我想得到

{"key":"Function2","value":26},  
{"key":"Function3","value":2}
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

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"] );
} );
Run Code Online (Sandbox Code Playgroud)

我明白了

{"key":"Function2","value":26},  
{"key":"Function3","value":2},  
{"key":"Function1","value":0}
Run Code Online (Sandbox Code Playgroud)

但我想删除"Function1"行,因为零值.

我试着用值维度过滤,没关系

var filterValues = ndx.dimension( 
   function( d )
   {
      return d["Value"];
   } ).filter( 
       function( d )
       {
          if( 0 < Math.abs( d ) )
            return d;
       } );  
Run Code Online (Sandbox Code Playgroud)

这让我很好:

{"Continents":"Europe","Function":"Function3","Value":"2"},  
{"Continents":"South Asia","Function":"Function2","Value":"14"},
{"Continents":"Europe","Function":"Function2","Value":"12"}
Run Code Online (Sandbox Code Playgroud)

但是filterValues现在是一个维度,然后我不知道如何使用这些过滤结果获得带有"Function"的新维度.
就像是

filteredValues.dimension( function( d )
        {
            return d["Function"];
        } );  
Run Code Online (Sandbox Code Playgroud)

这是错的!

有谁可以帮助我吗?我没有更多的想法!
非常感谢,
凡妮莎

Eth*_*ett 7

请创建一个jsFiddle.我不相信你发布的代码就像你说的那样,并且一个工作的例子将解决这个问题.特别:

var filterValues = ndx.dimension( 
   function( d )
   {
      return d["Value"];
   } ).filter( 
       function( d )
       {
          if( 0 < Math.abs( d ) )
            return d;
       } );  
Run Code Online (Sandbox Code Playgroud)

返回维度,而不是记录列表.

回答你的问题:如果你这样做,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;
       } );
Run Code Online (Sandbox Code Playgroud)

对新维度的.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; } );
Run Code Online (Sandbox Code Playgroud)

编辑:这不起作用.您实际上需要创建一个预过滤的伪Crossfilter组并将其传递给dc.js. 像这样:

var filteredFunctionAmountGroup = {
    all: function () {
        return functionAmountGroup.top(Infinity).filter( function (d) { return d.value !== 0; } );
    }
}
Run Code Online (Sandbox Code Playgroud)

示例:http://jsfiddle.net/h28hp/17/