【问题标题】:KDB/Q: create a new column based on the value of other columnsKDB/Q:根据其他列的值创建一个新列
【发布时间】:2021-01-20 11:32:47
【问题描述】:

这可能是一个简单的问题,但我无法让它发挥作用。我正在尝试创建一个列varNew,它等于Price 列的一半,如果var1 和var2 中只有一个列的值为1。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

我试过了:

update varNew:?[((var1+var2)>0);Price%2;Price] from table 和

varNew:?[(var1=1 and var2=0)|(var1=0 and var2=1);Price%2;Price] from table 和

varNew:?[var1=1 or var2=1;Price%2;Price] from table

但它们没有按预期工作。特别是,它返回 12 而不是 6。 到底是怎么回事?为什么这些条件不起作用?我该怎么做?

【问题讨论】:

    标签: kdb


    【解决方案1】:

    解决办法是:

     q)t:([]var1:0011b;var2:0101b;Price:10 14 12 20)
     q)update varNew:?[var1<>var2;Price%2;Price] from t
    

    这是 ? 的众多重载之一运营商 (https://code.kx.com/q/ref/overloads/#query)。在这种形式中,它被用作条件向量。

    【讨论】:

      【解决方案2】:

      进一步解释您的方法为何不起作用

      update varNew:?[((var1+var2)>0);Price%2;Price] from table
      

      (var1+var2)&gt;0 包括 var1 和 var2 都等于 1,导致最后一个价格除以 2,而这不是本意

      varNew:?[(var1=1 and var2=0)|(var1=0 and var2=1);Price%2;Price] from table
      

      q 从右到左计算(也称为Left-of-Right evaluation),这意味着您的代码实际上正在执行此操作(一旦添加了隐式括号)

      var1=1 and var2=0 => (var1=(1 and (var2=0)))
      var1=0 and var2=1 => (var1=(0 and (var2=1)))
      

      1 and 将始终保持右侧不变,第二行的 0 and 将始终返回 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-18
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多