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

How to deal with missing data with crossfilter and DC.js?

设以下数据集:

var dataset = [
    {
        "user": "u1",
        "question1": "answer1",
        "question2": "answer2",
        ...
    },
    ...
];

假设这个数据集不完整:一些用户可能已经回答了一个问题,但没有回答另一个问题。因此这个数据集有一些空白,其中没有出现值 "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.
}

看来组里没有正确处理缺失值,还是把缺失点归到第一个可能的类别

  1. 是bug吗?

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

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

谢谢!

不,这不是错误。 Crossfilter 尺寸必须是 naturally ordered 否则会发生奇怪的事情。

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

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

然后当您定义 dc.js 图表时,如果您不想在饼图中显示非答案(尽管您可能应该显示以便观众了解回答上述问题的人数比例):

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