首页 文章

kdb将列名传递给函数

提问于
浏览
4

我有一张 table

t: flip `ref`a`b`c`d`e!(til 10;10?10;10?10;10?10;10?10;10?10)

ref a   b   c   d   e
0   5   3   3   9   1
1   1   9   0   0   0
2   5   9   4   1   7
3   0   0   5   1   3
4   2   6   8   9   3
5   3   2   0   6   6
6   7   6   4   9   8
7   4   8   9   7   2
8   7   0   8   8   3
9   7   9   0   4   8

如果它们的值等于列ref中的值而不必为每列进行单行更新,如何将列a,b,c,...中的所有值都设置为0Ni?

所以有些东西看起来有点像(返回ERROR:type)

{update x:?[x=t;0Ni;x] from t} each `a`b`c`....

2 回答

  • 6

    之前的答案涉及使用字符串,这通常会非常混乱 . 为避免这种情况,可以通过将列名称作为符号来代替来构建查询 . 可以使用以下函数构建功能选择的字典:

    q){y!enlist[({?[y=x;0Ni;y]};x)],/:y:(),y}[`ref;`a`b`c]
    a| ({?[y=x;0Ni;x]};`ref) `a
    b| ({?[y=x;0Ni;x]};`ref) `b
    c| ({?[y=x;0Ni;x]};`ref) `c
    

    初始列为 x ,它允许将任意数量的列作为 y 传递以进行比较 .

    然后可以将其添加到功能选择中:

    q)![t;();0b;{y!enlist[({?[y=x;0Ni;y]};x)],/:y:(),y}[`ref;`a`b`c]]
    ref a b c d e
    -------------
    0   4 5 8 4 8
    1   2 6   9 1
    2   8 4 7 2 9
    3   0 1 2 7 5
    4   5 3   0 4
    5   8 3   1 6
    6   5 7 4 9 6
    7   2 8 2 2 1
    8     2 7 1 8
    9   6 1 8 8 5
    
  • 7

    您可以重复使用下一个代码段

    t: flip `ref`a`b`c`d`e!(til 10;10?10;10?10;10?10;10?10;10?10);
    columns: `a`b`c`d`e;
    ![t;();0b;columns!{parse "?[",x,"=ref;0Ni;",x,"]" }each string columns]
    

    更新列放在 columns 列表中 . 并且使用功能更新,其将每列 X 映射到值 ?[x=ref;0Ni;x]

相关问题