如何使用crossfilter和DC.js处理缺失的数据?

awe*_*ome 0 javascript crossfilter dc.js

让以下数据集:

var dataset = [
    {
        "user": "u1",
        "question1": "answer1",
        "question2": "answer2",
        ...
    },
    ...
];
Run Code Online (Sandbox Code Playgroud)

假设此数据集不完整:某些用户可能已回答了一个问题,但未回答另一个问题.因此,此数据集有一些空白,其中未出现值"questionX".

假设我们为每个问题创建了相关的饼图,如下所示:

var questions = ["question1", "question2", ...];
var cf = crossfilter(dataset);

for (var i = 0; i < questions.length; i++) {

    var questionDim = cf.dimension(function(d) { return d[questions[i]]});
    var questionGrp = questionDim.group().reduceCount();

    plotPieChart("#dc-" + questions[i], questionDim, questionGrp); // helper function to plot standard DC pie chart based on a dimension and group.
}
Run Code Online (Sandbox Code Playgroud)

看起来该组没有正确处理缺失值,仍然将缺失点分类为第一个可能的类别.

  1. 这是一个错误吗?

  2. 如果没有,一种可能的解决方案是预处理数据集并使用虚拟答案添加缺失的问题(例如"NA").但是,通过这样做,"NA"答案将显示为一个馅饼.那么如何从显示的结果中删除这个虚拟饼?

  3. 有没有更好的方法来处理这样的问题?

谢谢!

Eth*_*ett 7

不,这不是一个错误.Crossfilter尺寸必须自然排序或发生奇怪的事情.

您应该定义维度以处理未定义的值.你可以这样做:

var questionDim = cf.dimension(function(d) { return d[questions[i]] ? d[questions[i]] : "No answer"});
Run Code Online (Sandbox Code Playgroud)

然后,当您定义dc.js图表​​时,如果您不希望在饼图中显示非答案,则可以过滤掉您不想要的数据(尽管您可能应该显示它们以便观众了解比例回答说问题的人):

dc.pieChart('#pie-chart')
  .group(questionGrp)
  .data(function(group) {
     return group.all()
                 .filter(function(d) { return d.key !== "No answer"; }); 
  })
Run Code Online (Sandbox Code Playgroud)