2016-09-26 9 views
2

: 나는 색상 치수에 reduceCount 할crossfilter/reductio에서 그룹에서 그룹을 만드는 방법은 무엇입니까? 다음 데이터와

const now = new Date 
const data = [ 
    { player: 'bob', color: 'blue', date: new Date(+now + 1000) }, 
    { player: 'bill', color: 'green', date: new Date(+now + 2000) }, 
    { player: 'bob', color: 'red', date: new Date(+now + 3000) }, 
    { player: 'barbara', color: 'blue', date: new Date(+now + 4000) }, 
    { player: 'barbara', color: 'cyan', date: new Date(+now + 8000) }, 
    { player: 'barbara', color: 'magenta', date: new Date(+now + 10000) }, 
    { player: 'barbara', color: 'yellow', date: new Date(+now + 20000) }, 
] 

하지만 은 당 선수 최초의 색을 계산합니다. (참고 : 먼저 필터링 할 수있는 날짜 특성이 w.r.t입니다.) 와, 또 다른 예를

blue,2  # bob and barbara 
cyan,0 
green,1 # bill 
magenta,0 
red,0 
yellow,0 

: 나는이 예외 기능을 사용 reductio 작업을 얻기 위해 노력 해왔다하지만 예상되는 결과 포기하지 않았다 :

reducer = reductio() 
reducer.exception('player').exceptionCount(true) 
reducer(colorGroup) 

결과는 다음과 같아야을 now+2100 필터링 날짜 차원 .. now+20000 (첫 번째 행 즉 필터링됩니다) :

blue,1  # barbara 
cyan,0 
green,0 # (bill's first color is not counted because it is outside the date range) 
magenta,0 
red,1  # bob (blue is his first color overall, red is his first in this date range) 
yellow,0 

참고 : 나는 근래 모든 행을 사용하는 다른 그룹핑을 사용하여 크로스 필터에로드하기 전에 목록을 미리 필터링 할 수는 없습니다.

reductio()를 사용하는 방법이 있습니까? 또는 크로스 필터를 사용하여 "그룹화 할 때 그룹화"하는 방법에 대한 몇 가지 예가 있습니까? , 정말 값의 순서 고려하지 않습니다 - https://jsfiddle.net/qt5jxjm1/

+0

"더블 감소는"항상 까다로운 있습니다. 이것은 흥미로운 문제입니다. 이 사실을 설명 할 수있는 기회가 있습니까? (그냥 호기심에서.) – Gordon

+0

실제로 뭔가 일하는 것을 얻을 수있었습니다 : https : // jsfiddle.net/4j3gs57y/가짜 그룹을 사용합니다. 날짜에 필터링 할 때 올바른 데이터를 표시하지만 다른 측정 기준으로 필터링 할 때 오류가 발생합니다 (예 : 데이터가 칫솔질로 필터링되는 다른 그룹에서 실제로오고 있기 때문에 자체 차트가 변경됩니다. 마치 나머지 부분보다 초기 단계에서 발생하는 날짜 필터링을 원하는 것과 같습니다. – oof

+0

좋은 지적입니다. 이 예제에서는 색상별로 필터링되지만 원본 데이터는 날짜 차원에서 가져온 것이므로 다른 장애물이됩니다. 색상 차원에서 데이터를 가져 와서 날짜순으로 내부 정렬 할 수 있다고 생각합니다. – Gordon

답변

2

내가 crossfilter 매우 여기에 당신을 도울 것입니다 있는지 확실하지 않습니다 :

편집

링크가 표시 예상치 못한 결과를 jsfiddle하기 그리고 확실히 하나의 키로 정렬 한 다음 다른 키로 정렬하는 방법이 없습니다.

여기에는 주문에 다른 차원을 사용하고 그룹 키와 "첫 번째 필드"에 대한 몇 가지 접근 자, 즉 찾고자하는 필드를 사용하여 원하는대로 가깝게 할 수있는 가짜 그룹이 있습니다. 최초의 :

function double_reduce(dim, groupf, firstf) { 
    return { 
     all: function() { 
     var recs = dim.bottom(Infinity); 
     var hit = {}, bins = {}; 
     recs.forEach(function(r) { 
     var fkey = firstf(r), gkey = groupf(r); 
     var count = hit[fkey] ? 0 : 1; 
     hit[fkey] = true; 
     bins[gkey] = (bins[gkey] || 0) + count; 
     }); 
     return Object.keys(bins).map(function(k) { 
     return {key: k, value: bins[k]}; 
     }); 
    } 
    } 
} 

이처럼 사용이 할 수없는

var dubred_group = double_reduce(dateDim, 
    function(r) { return r.color;}, function(r) { return r.player; }); 

한 가지 필터링 된 모든 값을 0을 제공합니다. 일반적으로 크로스 필터는 증분 추가 및 제거를 수행하며 여기서 어떻게 가능할지를 보지 못합니다.

그래서 필터링 한 날짜가없는 결과가 좋지 :

[ 
    { 
    "key": "blue", 
    "value": 2 
    }, 
    { 
    "key": "green", 
    "value": 1 
    }, 
    { 
    "key": "red", 
    "value": 0 
    }, 
    { 
    "key": "cyan", 
    "value": 0 
    }, 
    { 
    "key": "magenta", 
    "value": 0 
    }, 
    { 
    "key": "yellow", 
    "value": 0 
    } 
] 

그러나 녹색 필터링 된 데이터에 나타나지 않기 때문에 필터링 된 경우를 누락 함이있다 :

[ 
    { 
    "key": "red", 
    "value": 1 
    }, 
    { 
    "key": "blue", 
    "value": 1 
    }, 
    { 
    "key": "cyan", 
    "value": 0 
    }, 
    { 
    "key": "magenta", 
    "value": 0 
    }, 
    { 
    "key": "yellow", 
    "value": 0 
    } 
] 

이를 아마 고칠 수 있었지만 나는 피드백을 위해 이것을 올릴 것이라고 생각했다. 바이올린의

데모 : http://jsfiddle.net/zdq4rj13/7/