使用空白进行交叉滤波过滤

时间:2018-05-23 12:20:48

标签: dc.js crossfilter

我使用crossfilter和dc来渲染与主题相关的观察图表。

每个观察都被视为一个维度。但是,并非所有行都具有所有维度的值,因为某些维度具有随时间重复的数据。例如,Column A在四行中有四个值,但Column B只有一个值,因此其他三行将是0 / "" / blank

现在,如果我在Column B上对具有特定范围/值的行进行过滤,那么我会自动丢失Column A的所有其他行,如果我想在Column A上过滤后过滤Column B然后我只会过滤掉两个都有值的公共行。

这可能听起来像是一种逻辑行为,但它并不适用于数据,因为如果我想过滤主题(即)具有Column A的特定范围和特定范围的行Column B会导致错误的结果,因为空白的值不会丢失,因为它是一个表,所有列都应该包含所有行的值。

是否有办法过滤Column B而不排除来自Column B的值只是因为它们是空白的?

对不起,需要那么多文字来解释!

更新

一个例子:为患者收集观察数据,让我们说“体重”。和血压'。对于一个受试者,可能有两个体重读数,但有四个血压读数。当我尝试为crossfilter创建数据结构时,我创建了两个列,一个用于重量,另一个用于血压。我想向用户显示两个条形图,显示所有主题中每个视图中值的分布。用户应该能够过滤具有重量范围和血压范围的受试者。由于受试者的两行不具有血压值,因此过滤重量将过滤出可能在血压过滤器范围内的受试者(即行),但没有重量值,因此它们是错误排除

2 个答案:

答案 0 :(得分:1)

我设法用数组来做,所以现在而不是我的数据以类似平面的结构结构:

{subjectId: "subject-101", study: "CRC305A", A: "24", B: "79"}
{subjectId: "subject-101", study: "CRC305A", A: "", B: "74"}
{subjectId: "subject-101", study: "CRC305A", A: "", B: "83"}
{subjectId: "subject-101", study: "CRC305A", A: "", B: "74"}
{subjectId: "subject-101", study: "CRC305A", A: "", B: "72"}
{subjectId: "subject-101", study: "CRC305A", A: "", B: "82"}
{subjectId: "subject-101", study: "CRC305A", A: "", B: "74"}
{subjectId: "subject-101", study: "CRC305A", A: "", B: "79"}
{subjectId: "subject-101", study: "CRC305A", A: "", B: "76"}
{subjectId: "subject-101", study: "CRC305A", A: "", B: "72"}

它的结构如下,以允许值从一列到另一列的可变性

{subjectId: “subject-101", 
 A:[“24”],
 B:[“79", "74", "83", "74", "72", "82", "74", "79", "76", "72", "79", "76", "77", "72", "83", "69", "72”]
}

过滤神奇地起作用了!

对于数组,有一个问题仍然与 dimension.top dimension.bottom 的行为有关。我会在另一个问题中发布这个问题

答案 1 :(得分:0)

如果值在逻辑上存在,您可能应该将它们传播到下一行,然后将它们粘贴到crossfilter中。 Crossfilter没有行顺序或默认值的任何概念。

如果我理解你的问题,我会做类似

的事情
var lastA, lastB, lastC;
data.forEach(function(d) {
  if(d.A)
    lastA = d.A:
  else
    d.A = lastA;
  if(d.B)
    lastB = d.B;
  else
    d.B = lastB
  // ...
});
var cf = crossfilter(data);

尝试创建一些"通配符值"就像你在你的问题中建议的那样,可能是可能的,但你必须至少改变每个图表的filter handler,因为他们希望处理离散值。