【问题标题】:Crossfilter: how to remove or filter values from groupCrossfilter:如何从组中删除或过滤值
【发布时间】:2014-02-25 12:01:22
【问题描述】:

我正在尝试获取一个包含 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”行。

我试过用value维度过滤,没关系

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"];
        } );  

错了!

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

【问题讨论】:

    标签: javascript crossfilter


    【解决方案1】:

    请创建一个 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; } );
        }
    }
    

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

    【讨论】:

    • 是的,非常感谢您的回答!我尝试了您的代码,但它仍然无法正常工作,因为最后,我需要一个 dc 组来制作条形图。我做了一个 jsFiddle --> jsfiddle.net/vma/h28hp/15 再次感谢您的帮助。凡妮莎
    • 啊,是的,我现在明白你的意思了。不幸的是,这实际上是 dc.js 可能不得不在其 API 中添加的东西,以使其可预测地工作。与此同时,我已经更新了您的 jsFiddle,其中包含一个伪造 Crossfilter 组的总黑客:jsfiddle.net/h28hp/17
    • 是的,它工作得很好!非常感谢这个想法,我没有这样的黑客:)
    猜你喜欢
    • 1970-01-01
    • 2015-12-21
    • 2020-06-04
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多