使用动态列数创建KDB + / Q表

时间:2015-05-31 11:49:42

标签: list kdb q-lang

我正在做这样的事情:

q)seed:5
q)numvals:3
q)id:`u#1+til seed;
q)vals:numvals cut (seed*numvals)?`8
q)1!([]id;vals)

现在我得到一张这样的桌子:

id| vals                      
--| --------------------------
1 | bhlkdkfd ghmjjepm gphfcddd
2 | jnloahej ipbcbnop heokehhg
3 | eijocfod nbbeopjo ddhiffmp
4 | cndelncn cmcmkckd aelpmccp
5 | nhjdlned cbkgpggg kgbcifbj

有没有办法在表格生成期间自动展开vals列表,以创建如下所示的表格:

id| vals0    vals1    vals2              
--| --------------------------
1 | bhlkdkfd ghmjjepm gphfcddd
2 | jnloahej ipbcbnop heokehhg
3 | eijocfod nbbeopjo ddhiffmp
4 | cndelncn cmcmkckd aelpmccp
5 | nhjdlned cbkgpggg kgbcifbj

1 个答案:

答案 0 :(得分:1)

表是从符号键字典到等长矢量列表的字典。使用" string til"动态创建列名称。

q){ `id xkey update id:i from flip (`$"vals",/:string til y)!(y#x)?\:`8 }[3;4]
id| vals0    vals1    vals2    vals3
--| -----------------------------------
0 | lkamnmmm nfnbfmkm kiblpojl onhlghno
1 | ehippdmm pocmhfkf edmeodcp iajdgbcc
2 | kcbjofjk ammebbah dajdafek aafdkpao

q){ `id xkey update id:i from flip (`$"vals",/:string til y)!(y#x)?\:`8 }[3;6]
id| vals0    vals1    vals2    vals3    vals4    vals5
--| -----------------------------------------------------
0 | hkdnolgf jbfokhef medkopgk objjkcmf hcnelcjh mkmiagdh
1 | kagnelcp lhjkpjen gokacegn iiocipck gpeachbd apmdghdl
2 | bejncmmp mfhnonen klihfepf oieoflli bbgombmk dkbnlhmd

您的密钥id列可能不是必需的,kdb表有一个虚拟i列,即行号。在这里,我使用更新使其可见。

要逐步解释此代码,请从右侧开始并尝试评估每个部分。

一个。在kdb中,我们可以调用一个带有两个参数的函数,如:(x是3,y是4)

q){x+y}[3;4]
7

B中。 kdb中的问号可以用于很多事情,当左边有一个数字而右边有一个'8'时,它生成n个长度为8的随机符号。这里我使用:adverb来修改函数和调用对于左边的每个项目多次:

q){(y#x)}[3;4]
3 3 3 3
q){(y#x)?\:`8}[3;4]
gknafbmp odolnkpd pblgicmp
aphcdfab mgidjeap iledgchk
ppinbcgh kcijdnbg jleeoccb
ljjdnami affhgjlm cnijgipc

C.通过连接字符串并使用副词再次生成列名:

q){(`$"vals",/:string til y)}[3;10]
`vals0`vals1`vals2`vals3`vals4`vals5`vals6`vals7`vals8`vals9

d。 kdb中的表是翻转的字典。一个简单的例子:

q)d:`a`b!(1 2 3;4 5 6)
q)d
a| 1 2 3
b| 4 5 6
q)flip d
a b
---
1 4
2 5
3 6

我使用该技术生成我的表:

q){(`$"vals",/:string til y)!(y#x)?\:`8 }[3;5]
vals0| djgndbde hlggaadm pbofgnac
vals1| goppgmfe jlfpmlab ibgkihem
vals2| npklikob okkmmlbi llnbhgha
vals3| lbekogce kjclledc cdjbmdpm
vals4| okmleidn lebjkagh cenblgbi
q){flip (`$"vals",/:string til y)!(y#x)?\:`8 }[3;5]
vals0    vals1    vals2    vals3    vals4
--------------------------------------------
iiifjhhi idinahfa iejibpcl hebikhmc cjlegpke
jicockjo kpjphpof kfimnmgh fpjolkmb mkkjldfc
acjfnnpd ciflaggo ennfgapg bbodkdla bichmhpj

电子。最后使用virtual i列进行更新,并使用xkey将其作为键控表:

q){ `id xkey update id:i from flip (`$"vals",/:string til y)!(y#x)?\:`8 }[3;4]
id| vals0    vals1    vals2    vals3
--| -----------------------------------
0 | mkfcpkdg dnhmifmf gedbdmkb dpdcdhib
1 | efhafoeh jpidfdno fdbddhgn fimolnmb
2 | jjmeickp clkbenoe lndodeel pgbfojdb

我建议使用这种技术来分解任何kdb代码以尝试理解它。从右到左工作,查询你不了解的最小部分......直到你这样做。