【问题标题】:crossfilter filtering with blanks带空格的交叉过滤器过滤
【发布时间】:2018-11-02 10:29:45
【问题描述】:

我正在使用 crossfilter 和 dc 来呈现与主题相关的观察图表。

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

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

这听起来可能是一种合乎逻辑的行为,但对数据而言并非如此,因为如果我想过滤具有特定范围 Column A 和特定范围 Column B 的主题(即)行,则会导致一个错误的结果,因为没有丢失的空白值它们就在那里,因为它是一个表,并且所有列都应该具有所有行的值。

有没有一种方法可以过滤 Column B 而不排除 Column B 中的值,因为它们是空白的?

很抱歉花了这么多文字来解释!

更新

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

【问题讨论】:

    标签: dc.js crossfilter


    【解决方案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.topdimension.bottom 相对于数组的行为有关。我会在另一个问题中发布它

    【讨论】:

    • 有趣。感谢您分享您的解决方案!
    【解决方案2】:

    如果这些值在逻辑上存在,您可能应该在将它们粘贴到交叉过滤器之前将它们传播到下一行。 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,因为他们希望处理离散值。

    【讨论】:

    • 谢谢,但是这样我将介绍“虚构”数据,我无法概括填充数据的规则,因为如果一列有两个行值,它会变得棘手,但是对于B 列有四个相同时间点的行值!现在我将使用 A 列的哪些值来填充剩余的两行。我会引入虚假数据,这对我的应用程序非常敏感
    • 当您说“随着时间的推移”时,我以为您的意思是一旦进行了测量,它将一直保持到稍后的行中再次测量为止。好的,我猜你需要通配符,一个可以匹配任何其他值的特殊值。
    • 我会尝试使用通配符。我正在考虑使用数组,但不确定条形图是否可以使用带有数值的交叉过滤器数组?到目前为止,我只看到了从字符串数组创建的行图。您能否提一些建议? ..谢谢
    • 嗯,数组/标签维度相似,但我不确定你会如何应用它。我认为您需要一个特殊的哨兵值以及检测它的特殊过滤器功能。让我看看我能不能破解一些东西,不要以为我以前见过这个要求。
    • 我会用一个真实的例子来更新这个问题,让它更清楚
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多