如何将函数应用于KDB中的某些列?

时间:2019-12-12 06:39:27

标签: kdb

假设我有这张桌子:

t: flip `col1`col2`x_col1`x_col2!(`a`b`c`d;`aa`bb`cc`dd;1 2 3 4;11 22 33 44)

col1    col2    x_col1  x_col2   x_col...
a         aa         1      11
b         bb         2      22
c         cc         3      33
d         dd         4      44

在这里我可以有任意数量的称为x_col1..100等的列。 我该如何说所有与“ x_col *”匹配的列乘以10?

col1    col2    x_col1  x_col2   x_col...
a         aa        10     110
b         bb        20     220
c         cc        30     330
d         dd        40     440

谢谢

2 个答案:

答案 0 :(得分:2)

可以使用以下内容:

q)@[t;c where (c:cols t) like "x_col*";*;10]
col1 col2 x_col1 x_col2
-----------------------
a    aa   10     110
b    bb   20     220
c    cc   30     330
d    dd   40     440

编辑:例如,如果通过x_col1查找倍数:

@[t;c where i;*;(sum i:(c:cols t) like "x_col*")#enlist t`x_col1]
col1 col2 x_col1 x_col2
-----------------------
a    aa   1      11
b    bb   4      44
c    cc   9      99
d    dd   16     176

答案 1 :(得分:2)

尽管我希望迈克尔斯回答更多,但为完整起见,功能形式为:

q)c:c where(c:cols t)like"x_col*"

q)![t;();0b;c!flip(10*;c)]
col1 col2 x_col1 x_col2
-----------------------
a    aa   10     110
b    bb   20     220
c    cc   30     330
d    dd   40     440

q)![t;();0b;c!flip(*;`x_col1;c)]
col1 col2 x_col1 x_col2
-----------------------
a    aa   1      11
b    bb   4      44
c    cc   9      99
d    dd   16     176

/using functional might allow for more flexibility (where clauses etc)
q)![t;enlist(=;`col1;enlist`d);0b;c!flip(*;`x_col1;c)]
col1 col2 x_col1 x_col2
-----------------------
a    aa   1      11
b    bb   2      22
c    cc   3      33
d    dd   16     176