2014-02-25 4 views
6

CSV 파일의 합계를 사용하여 그룹을 가져 오려고하지만 모든 0 값을 제거하려고합니다. 내 csv 파일의크로스 필터 : 그룹에서 값을 제거하거나 필터링하는 방법

예 : 나는

{"key":"Function2","value":26}, 
{"key":"Function3","value":2}, 
{"key":"Function1","value":0} 
01을 얻을

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} 

을 얻고 싶은

Continents  Function  Value 
South Asia  Function1 
South Asia  Function2  14 
Europe   Function1 
Europe   Function2  12 
Europe   Function3  2 

내 코드입니다

하지만 0 값 때문에 "Function1"줄을 제거하고 싶습니다. 그럼 내가 얻는 방법을 모르는,

{"Continents":"Europe","Function":"Function3","Value":"2"}, 
{"Continents":"South Asia","Function":"Function2","Value":"14"}, 
{"Continents":"Europe","Function":"Function2","Value":"12"} 

그러나 filterValues ​​이제 치수 :

나는 가치 차원과 필터링을 시도

, 그것은 나를 잘 돌려

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

괜찮아 이러한 필터링 된 결과가있는 "기능"이있는 새로운 차원입니다.

filteredValues.dimension(function(d) 
     { 
      return d["Function"]; 
     }); 

같은
뭔가는 잘못이다!

누군가 나를 도와 줄 수 있습니까? 나는 더 이상 아이디어가 없다!
고마워,
vanessa

답변

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

예 : http://jsfiddle.net/h28hp/17/

+0

네, 답변 주셔서 감사 많은! 나는 당신의 코드를 시도했지만, 결국 바 카르트를 만들기 위해 직류 그룹이 필요하기 때문에 여전히 효과가 없다. jsFiddle을 만들었습니다 -> http://jsfiddle.net/vma/h28hp/15/ 다시 도움을 청합니다. 바네사 – vanessa

+0

아, 그래, 네가 지금 무슨 뜻인지 안다.이것은 실제로 dc.js가 예상대로 작동하도록 API에 추가해야 할 것입니다. 그동안 CrossFilter 그룹을 위장한 총 해킹으로 jsFiddle을 업데이트했습니다. http://jsfiddle.net/h28hp/17/ –

+0

그래, 잘 작동하고 있습니다! 이 아이디어에 대해 너무 고마워, 나는 그런 해킹 안 했어 :) – vanessa

관련 문제