两个列上的单个Crossfilter维度和组?

时间:2016-04-27 13:08:08

标签: javascript crossfilter

我有以下CSV:

ccgcode,ccgname,metric,male,female
06M,Great Yarmouth And Waveney,3,24,76
05G,North Staffordshire,3,46,54
... etc.

如何创建Sex维度来推动dc.pieChart()?我的问题具体是关于Crossfilter的DimensionGroup方面,而不是如何渲染饼图。

1 个答案:

答案 0 :(得分:2)

Crossfilter不能简单地总结您需要的两个列,因此重新格式化数据是您最好的选择(根据评论中的对话)。如果您熟悉R,则可以使用melt.js,其工作方式与reshape类似,因此您无需触摸原始数据。

此解决方案假设您的数据是具有键值对的对象列表(非常标准):

data = [
  { ccgcode: '06M', ccgname: 'Great Yarmouth And Waveney', metric: 3, male: 24, female: 76 },
  { ccgcode: '05G', ccgname: 'North Staffordshire', metric: 3, male: 46, female: 54 },
...];

您首先想要识别您不想要的所有静态列"融化" (集计):

var staticColumns = ['ccgcode', 'ccgname', 'metric'];

然后使用melt取消组合男性和女性列。 Melt会收集您的数据,您不想融化的列以及新熔体列的名称(在您的情况下是sex):

var ndx = crossfilter(melt(data, staticColumns, 'sex', 'count'));
var sexDim  = ndx.dimension(function (d) { return d.sex; });

您最终得到以下维度:

sexDim = [
  { sex: 'male', count: 24, _id: 0, ccgcode: '06M', ccgname: 'Great Yarmouth And Waveney', metric: 3 },
  { sex: 'male', count: 46, _id: 1, ccgcode: '05G', ccgname: 'North Staffordshire', metric: 3},
  { sex: 'female', count: 76, _id: 0, ccgcode: '06M', ccgname: 'Great Yarmouth And Waveney', metric: 3 },
  { sex: 'female', count: 54, _id: 1, ccgcode: '05G', ccgname: 'North Staffordshire', metric: 3},
...];

请注意_id为您创建的有用的melt,以防您需要将所有内容重新组合在一起(尽管您的静态列也有助于此)。您可以将false作为第五个参数传递给melt,以排除_id属性。

你仍然可以按性别分组:

var males = sexDim.group().reduceSum(function (d) {
  if (d.sex === 'male') {
    return d.count;
  } else {
    return 0;
  }
});

希望有所帮助!