KDB get子字符串

KDB get子字符串,kdb,Kdb,如何添加包含符号的子字符串的列和包含符号的其他列。那么,从 t:flip `date`sym`pos!(`d1`d1`d1`d2;`aaaA1`bbbA1`aaaA2`aaaA3;1 2 3 1) date sym pos d1 aaaA1 1 d1 bbA1 2 d1 aaaA2 3 d2 aaaA3 1 到 编辑。子字符串应始终包含第一个len(symbol)-2个字符,因此在我上面的示例中,aaa表示aaaAx,

如何添加包含符号的子字符串的列和包含符号的其他列。那么,从

 t:flip `date`sym`pos!(`d1`d1`d1`d2;`aaaA1`bbbA1`aaaA2`aaaA3;1 2 3 1)

 date    sym    pos
 d1    aaaA1    1
 d1    bbA1     2
 d1    aaaA2    3
 d2    aaaA3    1


编辑。子字符串应始终包含第一个len(symbol)-2个字符,因此在我上面的示例中,aaa表示aaaAx,bb表示bbAx

如果要提取的子字符串长度不变,可以执行以下操作:

q)t:flip `date`sym`pos!(`d1`d1`d1`d2;`aaaA1`bbbA1`aaaA2`aaaA3;1 2 3 1)
q)update ext:`$3#'string sym from t
date sym   pos ext
------------------
d1   aaaA1 1   aaa
d1   bbbA1 2   bbb
d1   aaaA2 3   aaa
d2   aaaA3 1   aaa
如果不是这样,请提供有关如何识别要提取的子字符串的更多详细信息

希望这有帮助


乔纳森

下面可能有一个聪明的方法来应用它,但这是我第一次想到的

t:flip `date`sym`pos!(`d1`d1`d1`d2;`aaaA1`bbbA1`aaaA2`aaaA3;1 2 3 1)
t: update ctr: {-2 + count string x} each sym from t;
t:{[x] :update ext:x[`ctr]#string(x[`sym]) from x} each t;
第二行正在应用您的逻辑:len(symbol)-2 第三行从原始符号字符中提取“ctr”字符数

使用:


您没有这么说,但这是kdb+,所以让我们假设:

  • 你的桌子很长
  • 您的
    sym
    列有重复项
您不需要将所有符号转换为字符串并返回:仅转换为不同的符号。(在本例中,我更改了其中一个符号以创建副本。)

将函数应用于不同的项

q)update ext:.Q.fu[{`$-2 _'string x};sym] from t
date sym   pos ext
------------------
d1   aaaA1 1   aaa
d1   bbbA1 2   bbb
d1   aaaA2 3   aaa
d2   aaaA1 1   aaa

如果
sym
列已存储为,则此操作会更快,因为不需要计算即可获得不同的值。

谢谢您的回答。我在编辑器中提供了有关子字符串的更多详细信息。在本例中,您可以使用
updateext:`t
ah,sweet。。。根据乔纳森的回答,我进入了第二行,但在更新中我无法让它工作。我不知道{}每个t。感谢如果您对非常大的数据集(大约数亿行)运行此函数,那么性能可能是一个问题,因为上面的代码正在将每一行传递给函数。在这种情况下,您可能需要优化代码。。其他情况我认为应该可以。
q)t:flip `date`sym`pos!(`d1`d1`d1`d2;`aaaA1`bbA1`aaaA2`aaaA3;1 2 3 1)
q)update ext:`$-2_'string sym from t
date sym   pos ext
------------------
d1   aaaA1 1   aaa
d1   bbA1  2   bb 
d1   aaaA2 3   aaa
d2   aaaA3 1   aaa
q)t:flip `date`sym`pos!(`d1`d1`d1`d2;`aaaA1`bbbA1`aaaA2`aaaA1;1 2 3 1)
q)update ext:{nub:distinct x;(`$-2 _'string nub)nub?x}sym from t
date sym   pos ext
------------------
d1   aaaA1 1   aaa
d1   bbbA1 2   bbb
d1   aaaA2 3   aaa
d2   aaaA1 1   aaa
q)update ext:.Q.fu[{`$-2 _'string x};sym] from t
date sym   pos ext
------------------
d1   aaaA1 1   aaa
d1   bbbA1 2   bbb
d1   aaaA2 3   aaa
d2   aaaA1 1   aaa