Crossfilter 和 DC.js:减少到唯一的数字
Crossfilter and DC.js: reduce to unique number
在下面的示例中,我试图通过 Respond_Id
的唯一出现来求和。例如。在这种情况下,它应该总共 3
,"Respond_Id"
是 258,261
和 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,所以我尝试了(改编自示例):
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();
但似乎不起作用。有人知道如何让它工作吗?谢谢
根据你的 JSFiddle,你的设置是这样的:
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 将有一组。这不是你想要的。
您可以改用专为该用例设计的 dimension.groupAll
,但遗憾的是 dimension.groupAll.reduce
签名略有不同。最简单的解决方法是将维度定义为具有单个值:
var RespondDim = ndx.dimension(function (d) { return true;});
现在您会看到 ntotal.all()
看起来像这样:
{key: true, value: {RespondCount: 3, Respond_Ids: {258: 2, 261: 2, 345: 3}}}
工作fiddle:https://jsfiddle.net/v0rdoyrt/2/
在下面的示例中,我试图通过 Respond_Id
的唯一出现来求和。例如。在这种情况下,它应该总共 3
,"Respond_Id"
是 258,261
和 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,所以我尝试了(改编自示例):
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();
但似乎不起作用。有人知道如何让它工作吗?谢谢
根据你的 JSFiddle,你的设置是这样的:
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 将有一组。这不是你想要的。
您可以改用专为该用例设计的 dimension.groupAll
,但遗憾的是 dimension.groupAll.reduce
签名略有不同。最简单的解决方法是将维度定义为具有单个值:
var RespondDim = ndx.dimension(function (d) { return true;});
现在您会看到 ntotal.all()
看起来像这样:
{key: true, value: {RespondCount: 3, Respond_Ids: {258: 2, 261: 2, 345: 3}}}
工作fiddle:https://jsfiddle.net/v0rdoyrt/2/