【问题标题】:How to apply a function to certain columns in KDB?如何将函数应用于 KDB 中的某些列?
【发布时间】:2019-12-12 06:39:27
【问题描述】:

假设我有这张桌子:

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

谢谢

【问题讨论】:

    标签: kdb


    【解决方案1】:

    可以使用类似的东西:

    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
    

    【讨论】:

    • 非常感谢迈克尔。我可以再问一个问题。是否可以将原子 10 替换为 x_col1 之类的向量?
    • 没问题。是的,但它要求您将矢量塑造成与您正在操作的列相同的格式。例如,在这种情况下,您需要在操作 2 列时采用两次向量(制作矩阵):@[t;c where (c:cols t) like "x_col*";*;2#enlist t`x_col1]通过先进行索引然后使用该结果可能会帮助您更好地看到它: 10*@[t;c where (c:cols t) like "x_col*"] 有效,但 10 20 30 40*@[t; c where (c:cols t) like "x_col*"] 不会
    • 解决此问题的另一种方法是以函数形式编写更新语句,在其中获取要动态操作的列名,然后在函数形式中使用 xcol1 作为乘数。跨度>
    • 第二部分可以简化为@[t;c where(c:cols[t])like"x_col*";t[`x_col1]*]
    【解决方案2】:

    虽然我更喜欢 Michaels 的回答,但为了完整起见,函数形式应该是:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 2013-02-24
      • 2022-01-15
      • 2021-02-03
      • 2016-09-24
      • 2014-09-07
      相关资源
      最近更新 更多