javascript - 使用 CrossFilter 的唯一值数量

标签 javascript multidimensional-array grouping crossfilter

这里是 CrossFilter/JS 新手。

这个问题几乎准确地描述了我正在尝试做的事情,但似乎没有使用 CrossFilter 的解决方案:

How to return the number of unique values by category using crossfilter?

我有数据

var va = [{
date: "2014-10-01",
id: "1"},
{
date: "2014-10-02",
id: "1"},
{
date: "2014-10-03",
id: "1"},
{
date: "2014-10-04",
id: "1"},
{
date: "2014-10-05",
id: "1"},
{
date: "2014-10-01",
id: "2"},
{
date: "2014-10-02",
id: "2"},
{
date: "2014-10-03",
id: "2"},
{
date: "2014-10-04",
id: "1"},
{
date: "2014-10-01",
id: "3"},
{
date: "2014-10-02",
id: "3"},
{
date: "2014-10-03",
id: "1"},
{
date: "2014-10-01",
id: "4"},
{
date: "2014-10-02",
id: "1"},
{
date: "2014-10-01",
id: "5"}
}

我试图从中获取每个日期的唯一 ID 的数量。我想按日期分组,基本上计算该特定日期的唯一 ID:

"2014-10-01" - 5
"2014-10-02" - 3
"2014-10-03" - 2
"2014-10-04" - 1
"2014-10-05" - 1

目前,我正在尝试按照这个问题给出的答案

Crossfilter reduce :: find number of uniques

执行以下操作:

//Create a Crossfilter instance
var ndx = crossfilter(va);

//Define dimensions
var date_dim = ndx.dimension(function(d) {
    return d["date"]; });

//total number of ids per date
var num_ids_by_date = date_dim.group();

//unique number of ids per date
var num_uniq_ids_by_date = date_dim
    .group()
    .reduce(
        function (p, d) {
            if(d.id in p.ids){
            }
            else{
                p.ids[d.id] = 1;
            }
            return p;
        },

        function (p, d) {
            p.ids[d.id]--;
            if(p.ids[d.id] === 0){
                delete p.ids[d.id];
            }
            return p;
        },

        function () {
            return {ids: {}};
        })

当我查看 num_uniq_ids_by_date 对象并调用 num_uniq_ids_by_date.reduceCount().top(1) 时,它似乎与 num_ids_by_date 的输出相同。顶部(1)

所以,我似乎仍然没有得到我正在寻找的东西,并且被难住了一段时间。

有什么建议吗?提前致谢!

最佳答案

好的,我能够得到它。

我最后做了以下事情:

//Create a Crossfilter instance
var ndx = crossfilter(va);

//Define dimensions
var date_dim = ndx.dimension(function(d) {
    return d["date"]; });

var num_unique_ids_by_date = date_dim
    .group()
    .reduce(
        function (p, d) {
            if(d.id in p.ids){
                p.ids[d.id] += 1
            }
            else{
                p.ids[d.id] = 1;
                p.id_count++;
            }
            return p;
        },

        function (p, d) {
            p.ids[d.id]--;
            if(p.ids[d.id] === 0){
                delete p.ids[d.id];
                p.id_count--;
            }
            return p;
        },

        function () {
                return {ids: {},
                id_count: 0};
            });

这为我提供了唯一 ID 的总数以及每个 ID 出现的总数。

然后当我想使用 dc.js 在我的条形图中显示它时,我继续使用以下代码。

var minDate = date_dim.bottom(1)[0]["date"];
var maxDate = date_dim.top(1)[0]["date"];

var timeChart = dc.barChart("#time-chart");

timeChart
    .width(1500)
    .height(400)
    .margins({top: 10, right: 50, bottom: 30, left: 50})
    .dimension(date_dim)
    .group(num_unique_ids_by_date)
    .valueAccessor(function (d) {
        return d.value.id_count;
    })
    .transitionDuration(500)
    .x(d3.time.scale().domain([minDate, maxDate]))
    .elasticY(true)
    .elasticX(true)
    .xAxisLabel("Year")
    .yAxis();

dc.renderAll();

关于javascript - 使用 CrossFilter 的唯一值数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31686248/

相关文章:

r - 通过两组区分 geom_point

javascript - 为什么谷歌建议将 Analytics 异步代码放在 <head> 中的 *after* 脚本中?

php - javascript 小部件与 php 构建二维数组

python - 如何从二维数组中获取字符串值并分配给一维数组?

java - 通过二维数组查找固定长度的路径,该路径给出最大总和

r - 按组自定义 ggplot 图例

python - 根据彼此之间的差异对列表元素进行分组

javascript - 重新渲染整个播放列表的文本框上的 onBlur 函数阻止了切换到下一个文本框的能力

javascript - backbone、requirejs、grunt requirejs 使用外部模板

javascript - svg 双边框多边形