KDB/Q:基于其他列的值创建一个新列
这可能是一个简单的问题,但我无法让它发挥作用。我正在尝试创建一列KDB/Q:基于其他列的值创建一个新列,kdb,Kdb,这可能是一个简单的问题,但我无法让它发挥作用。我正在尝试创建一列varNew,如果只有一列var1和var2的值为1,则该列等于列Price的一半var1和var2仅取0或1的值。如果var1和var2都是1,则varNew=Price。所以想要的数据是这样的 var1 var2 Price varNew 0 0 10 10 0 1 14 7 1 0 12 6 1 1
varNew
,如果只有一列var1
和var2
的值为1,则该列等于列Price
的一半var1
和var2
仅取0或1的值。如果var1
和var2
都是1,则varNew=Price
。所以想要的数据是这样的
var1 var2 Price varNew
0 0 10 10
0 1 14 7
1 0 12 6
1 1 20 20
我试过:
更新varNew:?[(var1+var2)>0);价格%2;价格]来自表
和
varNew:?[(var1=1和var2=0)|(var1=0和var2=1);价格%2;价格]来自表
和
varNew:?[var1=1或var2=1;价格%2;价格]来自表
但它们并没有像预期的那样起作用。特别是,它返回12而不是6。
发生了什么事?为什么这些条件不起作用?我该怎么做呢?解决方案是:
q)t:([]var1:0011b;var2:0101b;Price:10 14 12 20)
q)update varNew:?[var1<>var2;Price%2;Price] from t
q)t:([]var1:0011b;var2:0101b;价格:10141220)
q) 更新varNew:?[var1var2;价格%2;价格]来自t
这是的许多重载之一?运算符()。在这种形式中,它被用作一个向量条件。进一步解释您的方法不起作用的原因
update varNew:?[((var1+var2)>0);Price%2;Price] from table
(var1+var2)>0
包括var1和var2都等于1,导致最后一个价格除以2,而这不是目的
varNew:?[(var1=1 and var2=0)|(var1=0 and var2=1);Price%2;Price] from table
varNew:?[((var1=1) and var2=0)|((var1=0) and var2=1);Price%2;Price] from table
q从右向左求值(也称为),这意味着您的代码实际上正在执行此操作(一旦添加了隐式括号)
1和
将始终保持右侧不变,第二行的0和
将始终返回0,因此整行简化为:
varNew:?[(var1=(var2=0))|(var1=0);Price%2;Price] from table
这与您试图编写代码的条件不同。为了解决这个问题,您可以添加额外的括号,以确保它的计算结果与您预期的一样,尽管Dan的答案更有效
varNew:?[((var1=1) and var2=0)|((var1=0) and var2=1);Price%2;Price] from table