使用 CrossFilter 的唯一值数量
Number of Unique Values Using 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.top(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();
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.top(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();