我使用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创建数据结构时,我创建了两个列,一个用于重量,另一个用于血压。我想向用户显示两个条形图,显示所有主题中每个视图中值的分布。用户应该能够过滤具有重量范围和血压范围的受试者。由于受试者的两行不具有血压值,因此过滤重量将过滤出可能在血压过滤器范围内的受试者(即行),但没有重量值,因此它们是错误排除
答案 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,因为他们希望处理离散值。