【问题标题】:kdb - how to create sum a list of dynamic columns using functional selectkdb - 如何使用功能选择创建动态列列表的总和
【发布时间】:2021-02-02 18:57:14
【问题描述】:

我希望能够在给定`a`b`c 列表的情况下构造(+; (+; `a; `b); `c)

同样,如果我有`a`b`c`d 的列表,我希望能够构建另一个巢,依此类推,以此类推。

我一直在尝试使用扫描,但我无法正确使用它

【问题讨论】:

    标签: kdb


    【解决方案1】:
    q)fsum:(+;;)/
    enlist[+;;]/
    
    q)fsum `a`b`c`d
    +
    (+;(+;`a;`b);`c)
    `d
    

    【讨论】:

      【解决方案2】:

      如果您只想要原始解析树输出,一种方法是形成等效字符串并使用parse。对于更复杂的示例不建议这样做,但在这种情况下很清楚。

      {parse "+" sv string x}[`a`b`c`d]
      +
      `d
      (+;`c;(+;`b;`a))
      

      如果您希望在功能选择中使用它,我们可以使用 +/ 而不是像您在示例中指定的那样单独添加每一列

      q)parse"+/[(a;b;c;d)]"
      (/;+)
      (enlist;`a;`b;`c;`d)
      
      q)f:{[t;c] ?[t;();0b;enlist[`res]!enlist (+/;(enlist,c))]}; 
      q)t:([]a:1 2 3;b:4 5 6;c:7 8 9;d:10 11 12)
      
      q)f[t;`a`b`c]
      res
      ---
      12 
      15 
      18 
      
      q)f[t;`a`b]
      res
      ---
      5  
      7  
      9  
      
      q)f[t;`a`b`c]~?[t;();0b;enlist[`res]!enlist (+;(+;`a;`b);`c)]
      1b
      

      您还可以通过直接索引来获得总和,以返回每列值的列表并对这些值求和。我们使用(), 将任何输入变成一个列表,否则它将对该单列中的值求和并仅返回一个值

      q)f:{[t;c] sum t (),c}
      q)f[t;`a`b`c]
      12 15 18
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-07
        相关资源
        最近更新 更多