2014-12-21 5 views
0

하나의 필드 값에 대한 계산을 기반으로 샘플을 그룹화하는 데 문제가 있습니다. 샘플은한 필드에 종속 된 값을 기준으로 샘플 그룹화

{ 
 
    "dataset": "DATASET2", 
 
    "sampleid": "ID2653", 
 
    "variables": { 
 
    // several variables, key: val 
 
    }, 
 
    "bmus": { 
 
    "x": 3, 
 
    "y": 7 
 
    } 
 
}

샘플 정적 9x7 격자의 셀에 속하는 bmus 필드 그리드 샘플의 위치를 ​​맵의 형태이다. 원형 필터를 그리드 상단에서 이동할 수 있으며 원 필터를 이동 한 후 원 안에있는 샘플을 그룹화 할 수 있기를 원합니다. 그룹핑은

{ 
 
    "key": { 
 
    "circles": ["circle1", "circle2"] // or [], ['circle1'], ['circle2'] 
 
    }, 
 
    "value": 282 
 
}

의 형태 일 것이고, 그 정의 감소 함수 후 어떤 변수의 값에 기초하여 값을 계산하는 데 적용된다.

차원을 생성하고 그룹에 대한 나의 현재 설정은 다음과 같다 : 처음에는

$scope.dimension = crossfilterInst.dimension(function(d) { 
 
    return { 
 
    bmu: d.bmus, 
 
    valueOf: function() { 
 
     var ret = _.isUndefined(d.bmus) ? String(constants.nanValue) + "|" + String(constants.nanValue) : d.bmus.x + "|" + d.bmus.y; 
 
     // for NaN's the result is "-100|-100", otherwise in the form of "5|4" 
 
     return ret; 
 
    } 
 
    }; 
 
}); 
 

 
var group = $scope.dimension.group(function(d) { 
 
    return { 
 
     circles: function() { 
 
     return FilterService.inWhatCircles(d.bmu); 
 
     }, 
 
     valueOf: function() { 
 
     return String(this.circles()); 
 
     } 
 
    }; 
 
});

group.all()의 그룹이 올 수 있습니다. 나중에 을 crossfilterInst의 다른 차원에 적용하여 FilterService.inWhatCircles()의 반환 값에 영향을 주어 선택된 샘플 양에 영향을주는 서클 필터가 그리드에서 이동하면 group.all()에서 반환 된 그룹의 샘플 수가 점점 더 정확하지 않게됩니다.

처음에는 FilterService.inWhatCircles()의 반환 값이 잘못된 경우가 있다고 생각했습니다. 오래 디버그 한 후에 나는 차원을 다시 만들면 (예전 코드를 처리하고 $scope.dimension을 생성하는 동일한 코드를 실행 한 다음) 동일한 코드를 사용하여 샘플을 그룹화하면 결과 그룹이 올바른 것으로 나타났습니다. Crossfilter API 보면

, 나는 crossfilter가, 또는이 요구 사항을 만족하는 나사까지 내 그룹을 일부 캐싱을지지 않습니다 의심 :

값 기능처럼

이 groupValue은 자연적으로 주문 값을 반환해야합니다; 또한이 순서는 치수의 값 함수와 일치해야합니다.

길고도 짧은 이야기 : 나는 bmus 샘플의 필드와 반복 함께 그룹을 기반으로 FilterService.inWhatCircles()을 계산하는 방법을 함수 반환 값은 변경할 수 있습니다 때, 올바른을 얻을 때마다 치수를 다시 만들 필요없이 여러 떼?

답변

1

짐작 하시겠습니까? crossfilter는 데이터를 동적으로 계산하는 그룹 필터 나 차원 필터를 사용하지 못하도록 데이터를 인덱싱합니다. 키는 이미 데이터에 있어야하며 변경할 수 없습니다. 그들은 한 번만 읽힐 것입니다.

그룹 키가 차원 키와 일치하지 않는다고해서 문제가 발생하지 않습니다.

대신, fake group, 모든 데이터 포인트를 통해 루프 및 각 inWhatCircles 값과 일치하는 숫자, 예를 세는 .all() 방법으로 개체 사용할 수 있습니다 지도를 사용하여. 그런 다음 group.all이 반환하는 동일한 종류의 {키, 값} 쌍을 반환해야합니다.

매번 새로운 차원을 모든 인덱스와 함께 생성하는 것보다 효율적이며 crossfilter의 이점을 많이 잃지 않습니다. 어쨌든 이러한 종류의 동적 계산에 최적화되어 있지 않기 때문입니다.

+0

그래, 내가 목표로 삼고있는 방법이 순수한 크로스 필터로는 가능하지 않거나 적어도 가능할 것으로 보인다. 차원을 다시 초기화하는 것이 옵션이 아니라는 것을 알았지 만 그룹화를 다시하면 충분했을 것입니다. 실제로 ("d.bmu"를 기반으로 그룹화 한 다음 필요한 그룹을 연결하여) 문제를 우회하기 위해 위조 된 그룹 방법을 사용하고있었습니다. 사용자 정의 함수 결과를 연결해야하기 때문에 내 요구에 부적합합니다. 하지만 crossfilter 직접 이런 종류의 동적 계산을 위해 사용되는 것 같아요. – amergin

+0

크로스 필터의 모든 설계 결정은 효율성에 관한 것입니다. 여기에서 감소를 재 계산하기는 쉽지만 그룹간에 행을 이동하는 것은 어렵습니다 (계산 방식). 내가 말하는 가짜 그룹 솔루션은 무엇보다 효율적이어야합니다. – Gordon