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

时间:2015-07-29 11:55:24

标签: javascript dc.js crossfilter

请使用以下数据集:

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. 这是一个错误吗?

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

  3. 有没有更好的方法来解决这个问题?

  4. 谢谢!

1 个答案:

答案 0 :(得分:7)

不,这不是错误。 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"; }); 
  })