如何总结多个维度

时间:2014-12-18 10:50:06

标签: javascript json crossfilter

我刚开始使用Crossfilter,并试图了解一些还原功能是如何工作的。我觉得这对我来说很有意义,并试图根据样本数据建立一个小例子,但我似乎无法让它发挥作用。

我尝试做的是将多个列相加以根据字段(例如类型)得到它们的总数(例如总数和小费)。现在我不确定我是如何使用多个列进行此操作的,但实际上我发现的是我采用的方法似乎甚至不能用于单个列。

我已经整理了一个简短的片段,我对输出的预期是3行,显示tabvisacash的总和。



var payments = crossfilter([
  {date: "2011-11-14T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab"},
  {date: "2011-11-14T16:20:19Z", quantity: 2, total: 190, tip: 100, type: "tab"},
  {date: "2011-11-14T16:28:54Z", quantity: 1, total: 300, tip: 200, type: "visa"},
  {date: "2011-11-14T16:30:43Z", quantity: 2, total: 90, tip: 0, type: "tab"},
  {date: "2011-11-14T16:48:46Z", quantity: 2, total: 90, tip: 0, type: "tab"},
  {date: "2011-11-14T16:53:41Z", quantity: 2, total: 90, tip: 0, type: "tab"},
  {date: "2011-11-14T16:54:06Z", quantity: 1, total: 100, tip: 0, type: "cash"},
  {date: "2011-11-14T16:58:03Z", quantity: 2, total: 90, tip: 0, type: "tab"},
  {date: "2011-11-14T17:07:21Z", quantity: 2, total: 90, tip: 0, type: "tab"},
  {date: "2011-11-14T17:22:59Z", quantity: 2, total: 90, tip: 0, type: "tab"},
  {date: "2011-11-14T17:25:45Z", quantity: 2, total: 200, tip: 0, type: "cash"},
  {date: "2011-11-14T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "visa"}
]);

var typeDimension = payments.dimension(function(d) { return d.type; });
typeDimension.group().reduceSum(function(d) { return d.total; });

$(typeDimension.top(Infinity)).each(function(d) { 
     $('#tgt').append("<div>" + JSON.stringify(this) + "</div>");
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/crossfilter/1.3.11/crossfilter.min.js"></script>
<div id="tgt">
</div>
&#13;
&#13;
&#13;

修改

为了更好地解释我的用例 - 我实际上得到了一些不同的数据,大约10k行以下格式:

{ athlete: "Michael Phelps",age:23,country:"United States",year:2008,date: 39684,sport:"Swimming",gold:8,silver:0,bronze:0,total: 8 },
{ athlete: "Michael Phelps",age:19,country:"United States",year:2004,date: 38228,sport:"Swimming",gold:6,silver:0,bronze:2,total: 8 },
{ athlete: "Michael Phelps",age:27,country:"United States",year:2012,date: 41133,sport:"Swimming",gold:4,silver:2,bronze:0,total: 6 },

我想要做的是将青铜,银和金的价值分组,所以我可以看到每年发出的奖牌总数,这样我就可以正确地展示它们。目前我使用的图形库在未分组时无法处理数据,下图说明了每个条上带阴影的条带,因为每个堆栈都有数百个小阴影矩形。 / p>

enter image description here

1 个答案:

答案 0 :(得分:1)

您还可以使用Alasql JavaScript SQL库替代CrossFilter(当然,如果使用CrossFilter对您的项目并不重要)可以将多个维度相加。

var data = [
   {date: "2011-11-14T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab"},
   {date: "2011-11-14T16:20:19Z", quantity: 2, total: 190, tip: 100, type: "tab"}];

var res = alasql('SELECT type, SUM(quantity) quantity AS , SUM(total) AS total, \
             SUM(tip) AS tip FROM ? GROUP BY type', [data]);

试试此示例at jsFiddle。或者Alasql+d3.js integration的另一个例子,其中包含多维的和。

顺便说一下,Alasql对这些数据的速度比CrossFilter快(见jsPerf test)。

抱歉,对于'非CrossFilter'回答。