Crossfilter和DC.js:减少为唯一编号 [英] Crossfilter and DC.js: reduce to unique number

查看:81
本文介绍了Crossfilter和DC.js:减少为唯一编号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在下面的示例中,我试图通过 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆