1

I am doing stuff like this:

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

Now I am getting a table like this:

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

Is there a way to automatically unfold the vals list during the table generation to create a table that looks like this:

id| vals0    vals1    vals2              
--| --------------------------
1 | bhlkdkfd ghmjjepm gphfcddd
2 | jnloahej ipbcbnop heokehhg
3 | eijocfod nbbeopjo ddhiffmp
4 | cndelncn cmcmkckd aelpmccp
5 | nhjdlned cbkgpggg kgbcifbj
Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
Martin Mlostek
  • 2,755
  • 1
  • 28
  • 57

1 Answers1

1

A table is a dictionary from a dictionary of symbol keys to a list of equal length vectors. Dynamically create the column names using "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

Your key id column probably isn't necessary, kdb tables have a virtual i column that is the row number. Here I use an update to make it visible.

To explain this code step by step, start from the right and try evaluating each part.

A. In kdb we can call a function with two arguments like so: (x is 3, y is 4)

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

B. The question mark in kdb can be used for a lot of things, When it has a number on the left and a `8 on the right it generates n random symbols of length 8. Here I use the : adverb to modify the function and call it multiple times for-each item on the left:

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.Generate the column names by concatenating strings and again using an adverb:

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

D. A table in kdb is a flipped dictionary. A simple example:

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

I use that technique to generate my table:

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

E. Finally update using the virtual i column and use xkey to make it a keyed table:

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

I advise using this technique to break down any kdb code to try and understand it. Work from right to left, querying the smallest part you don't understand...until you do.

Ryan Hamilton
  • 2,601
  • 16
  • 17
  • Puuh.. thanks for that! it Works, but puuuuuh.. Would you mind explaining it a little bit. Like read the line what happens? – Martin Mlostek May 31 '15 at 13:11
  • Just added some more questios.. those are related to this one. Thats why i am adding it [here](http://stackoverflow.com/questions/30559343/kdb-q-syntax-for-gods) – Martin Mlostek May 31 '15 at 15:50
  • Ah one more thing regarding this table. The virtual i index, is it persistent, i mean if i reorder the table, will that index be still usable as primary key? – Martin Mlostek May 31 '15 at 16:29