在KDB中将单列拆分为多列

时间:2018-03-11 20:32:50

标签: kdb

我希望在应用复杂函数后将列中的值拆分为多个列。

e.g。对于以下交易表t,我想将sym拆分为2个单独的列sym和src。但是,我将要应用的功能会稍微复杂一些。

q)t:([] time:10:01:01 10:01:03 10:01:04;sym:`goog.l`vod.l`apple.o;qty:100 200 150)
time     sym     qty
--------------------
10:01:01 goog.l  100
10:01:03 vod.l   200
10:01:04 apple.o 150

4 个答案:

答案 0 :(得分:3)

如果你的表格非常大并且sym列非常重复(看起来它就是它的刻度数据),那么以下内容会更快:

f:{` vs'x}
@[t;`col1`col2;:;flip .Q.fu[f]t`sym]

答案 1 :(得分:1)

完成此任务的方法之一是:

q)update sym:sym[;0] , mkt:sym[;1] from update ` vs/:sym from t
time     sym   qty mkt
----------------------
10:01:01 goog  100 l  
10:01:03 vod   200 l  
10:01:04 apple 150 o  

如果您对除了需要拆分的表格之外的任何其他列不感兴趣,那么

q)exec  {`s`mkt!` vs x}each sym  from t
s     mkt
---------
goog  l  
vod   l  
apple o  

答案 2 :(得分:1)

您可以通过拆分sym创建一个src.的表格,然后创建一个词典,然后使用flip创建一个表格:

q)show r:exec flip`sym`src!flip` vs/:sym from t
sym   src
---------
goog  l
vod   l
apple o

可以使用each-both ,'

将其加入原始表格
q)t,'r
time     sym   qty src
----------------------
10:01:01 goog  100 l
10:01:03 vod   200 l
10:01:04 apple 150 o

如果列顺序很重要,则可以使用xcols修复此问题:

q)`time`sym`src xcols t,'r
time     sym   src qty
----------------------
10:01:01 goog  l   100
10:01:03 vod   l   200
10:01:04 apple o   150

答案 3 :(得分:1)

另一种选择是;

q)(,'/)(t;flip`sym`src!exec flip ` vs'sym from t)
time     sym   qty src
----------------------
10:01:01 goog  100 l
10:01:03 vod   200 l
10:01:04 apple 150 o