我目前正在尝试弄清楚如何使用DJ.js和D3.js来显示唯一记录的数量
数据集如下所示:
id,name,artists,genre,danceability,energy,key,loudness,mode,speechiness,acousticness,instrumentalness,liveness,valence,tempo,duration_ms,time_signature
6DCZcSspjsKoFjzjrWoCd,God's Plan,Drake,Hip-Hop/Rap,0.754,0.449,7,-9.211,1,0.109,0.0332,8.29E-05,0.552,0.357,77.169,198973,4
3ee8Jmje8o58CHK66QrVC,SAD!,XXXTENTACION,Hip-Hop/Rap,0.74,0.613,8,-4.88,1,0.145,0.258,0.00372,0.123,0.473,75.023,166606,4
数据集中有100条记录,我希望该数目显示70个唯一艺术家的数目。
var ndx = crossfilter(spotifyData);
totalArtists(ndx);
....
function totalArtists(ndx) {
// Select the artists
var totalArtistsND = dc.numberDisplay("#unique-artists");
// Count them
var dim = ndx.dimension(dc.pluck("artists"));
var uniqueArtist = dim.groupAll();
totalArtistsND.group(uniqueArtist).valueAccessor(x => x);
totalArtistsND.render();
}
结果我只得到100,而我应该得到70。
谢谢一百万,任何帮助将不胜感激
最佳答案
您处于正确的轨道上-groupAll对象通常是与dc.numberDisplay
一起使用的正确对象。
但是,dimension.groupAll不使用维度的键函数。像任何groupAll一样,它查看所有记录并返回一个值; dimension.groupAll()
和crossfilter.groupAll()
之间的唯一区别是,前者不遵守维度的过滤条件,而后者则遵守所有过滤条件。
如果要使用dimension.groupAll
,则必须编写reduce函数,以便在添加和删除行时对其进行监视,并统计已看到的唯一艺术家的数量。听起来有点乏味,甚至可能是越野车。
相反,我们可以编写一个“fake groupAll”,该对象的.value()
方法返回根据当前过滤器动态计算的值。
普通组对象已经具有唯一的计数:箱数。因此,我们可以创建一个伪造的groupAll,它包装一个普通的组并返回group.all()
返回的数组的长度:
function unique_count_groupall(group) {
return {
value: function() {
return group.all().filter(kv => kv.value).length;
}
};
}
请注意,我们还必须在计数之前滤除任何值为零的bin。
使用伪造的groupAll像这样:
var uniqueArtist = unique_count_groupall(dim.group());
Demo fiddle。
我刚刚添加了这个to the FAQ。
关于dc.js - 如何在dc.js numberDisplay中获取动态字段计数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58321985/