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