kdb - 如何使用函数 select 创建动态列列表的总和
kdb - how to create sum a list of dynamic columns using functional select
我希望能够在给定 `a`b`c
列表的情况下构建 (+; (+; `a; `b); `c)
同样,如果我有 `a`b`c`d
的列表,我希望能够构建另一个巢,依此类推。
我一直在尝试使用扫描,但无法正确使用
如果您只想要原始解析树输出,一种方法是形成等效字符串并使用 parse
。对于更复杂的示例,不建议这样做,但在这种情况下很清楚。
{parse "+" sv string x}[`a`b`c`d]
+
`d
(+;`c;(+;`b;`a))
如果您想在函数 select 中使用它,我们可以使用 +/
而不是单独添加每一列,就像您在示例中指定的那样
q)parse"+/[(a;b;c;d)]"
(/;+)
(enlist;`a;`b;`c;`d)
q)f:{[t;c] ?[t;();0b;enlist[`res]!enlist <b>(+/;(enlist,c))</b>]};
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
您还可以通过直接索引 return 每个列值的列表并对这些值求和来获得总和。我们使用 (),
将任何输入转换为列表,否则它将对该单列中的值求和,并且 return 只有一个值
q)f:{[t;c] sum t (),c}
q)f[t;`a`b`c]
12 15 18
q)fsum:(+;;)/
enlist[+;;]/
q)fsum `a`b`c`d
+
(+;(+;`a;`b);`c)
`d
我希望能够在给定 `a`b`c
(+; (+; `a; `b); `c)
同样,如果我有 `a`b`c`d
的列表,我希望能够构建另一个巢,依此类推。
我一直在尝试使用扫描,但无法正确使用
如果您只想要原始解析树输出,一种方法是形成等效字符串并使用 parse
。对于更复杂的示例,不建议这样做,但在这种情况下很清楚。
{parse "+" sv string x}[`a`b`c`d]
+
`d
(+;`c;(+;`b;`a))
如果您想在函数 select 中使用它,我们可以使用 +/
而不是单独添加每一列,就像您在示例中指定的那样
q)parse"+/[(a;b;c;d)]"
(/;+)
(enlist;`a;`b;`c;`d)
q)f:{[t;c] ?[t;();0b;enlist[`res]!enlist <b>(+/;(enlist,c))</b>]};
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
您还可以通过直接索引 return 每个列值的列表并对这些值求和来获得总和。我们使用 (),
将任何输入转换为列表,否则它将对该单列中的值求和,并且 return 只有一个值
q)f:{[t;c] sum t (),c}
q)f[t;`a`b`c]
12 15 18
q)fsum:(+;;)/
enlist[+;;]/
q)fsum `a`b`c`d
+
(+;(+;`a;`b);`c)
`d