Crossfilter和DC.js:减少为唯一编号 [英] Crossfilter and DC.js: reduce to unique number
问题描述
在下面的示例中,我试图通过 Respond_Id
的唯一出现进行总结。例如。在这种情况下,总计应为 3
, Respond_Id
为 258,261
和 345
。
In the example below, I am trying to sum by unique occurence of Respond_Id
. eg. in this case, it should be in total 3
, "Respond_Id"
being 258,261
and 345
.
这是我的数据:
{"Respond_Id":258,"Gender":"Female","Age":"18-21","Answer":424},
{"Respond_Id":258,"Gender":"Female","Age":"18-21","Answer":428},
{"Respond_Id":261,"Gender":"Male","Age":"22-26", "Answer":427},
{"Respond_Id":261,"Gender":"Male","Age":"22-26", "Answer":432},
{"Respond_Id":345,"Gender":"Female","Age":"27-30","Answer":424},
{"Respond_Id":345,"Gender":"Female","Age":"27-30","Answer":425},
{"Respond_Id":345,"Gender":"Female","Age":"27-30","Answer":433},
我知道我应该将group reduce用于这样,所以我尝试了(从示例中改编而成):
I know I should use group reduce for this, so I tried (adapted from an example):
var ntotal = answerDim.group().reduce(
function(p, d) {
if(d.Respond_Id in p.Respond_Ids){
p.Respond_Ids[d.Respond_Id]++;
}
else {
p.Respond_Ids[d.Respond_Id] = 1;
p.RespondCount++;
}
return p;
},
function (p, d) {
p.Respond_Ids[d.Respond_Id]--;
if(p.Respond_Ids[d.Respond_Id] === 0){
delete p.Respond_Ids[d.Respond_Id];
p.RespondCount--;
}
return p;
},
function () {
return {
RespondCount: 0,
Respond_Ids: {}
};
}
);
然后:
numberDisplay
.group(ntotal)
.valueAccessor(function(d){ return d.value.RespondCount; });
dc.renderAll();
但似乎不起作用。有人知道如何使其工作吗?谢谢
But seems not working. Does someone know how to make it work ? Thank you
推荐答案
基于您的JSFiddle,您的设置如下:
Based on your JSFiddle, your setup is like this:
var RespondDim = ndx.dimension(function (d) { return d.Respond_Id;});
var ntotal = RespondDim.group().reduce(
function(p, d) {
if(d.Respond_Id in p.Respond_Ids){
p.Respond_Ids[d.Respond_Id]++;
}
else {
p.Respond_Ids[d.Respond_Id] = 1;
p.RespondCount++;
}
return p;
},
function (p, d) {
p.Respond_Ids[d.Respond_Id]--;
if(p.Respond_Ids[d.Respond_Id] === 0){
delete p.Respond_Ids[d.Respond_Id];
p.RespondCount--;
}
return p;
},
function () {
return {
RespondCount: 0,
Respond_Ids: {}
};
});
这里要注意的是,默认情况下,您的组密钥与维度相同键。因此,每个受访者ID您将有一组。这不是您想要的。
What is important to note here is that your group keys, by default, are the same as your dimension keys. So you will have one group per respondent ID. This isn't what you want.
您可以切换到使用 dimension.groupAll
用例,但不幸的是 dimension.groupAll.reduce
签名略有不同。最简单的解决方法是将维度定义为一个单一值:
You could switch to using dimension.groupAll
, which is designed for this use case, but unfortunately the dimension.groupAll.reduce
signature is slightly different. The easiest fix for you is going to be to just define your dimension to have a single value:
var RespondDim = ndx.dimension(function (d) { return true;});
现在,您会看到 ntotal.all()
如下所示:
Now you'll see that ntotal.all()
will look like this:
{key: true, value: {RespondCount: 3, Respond_Ids: {258: 2, 261: 2, 345: 3}}}
工作的小提琴: https://jsfiddle.net/v0rdoyrt/2/
这篇关于Crossfilter和DC.js:减少为唯一编号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!