KDB+ / Q Table 创建动态列数
KDB+ / Q Table creation with dynamic number of columns
我正在做这样的事情:
q)seed:5
q)numvals:3
q)id:`u#1+til seed;
q)vals:numvals cut (seed*numvals)?`8
q)1!([]id;vals)
现在我得到一个 table 这样的:
id| vals
--| --------------------------
1 | bhlkdkfd ghmjjepm gphfcddd
2 | jnloahej ipbcbnop heokehhg
3 | eijocfod nbbeopjo ddhiffmp
4 | cndelncn cmcmkckd aelpmccp
5 | nhjdlned cbkgpggg kgbcifbj
有没有一种方法可以在 table 生成期间自动展开 vals
列表,以创建如下所示的 table:
id| vals0 vals1 vals2
--| --------------------------
1 | bhlkdkfd ghmjjepm gphfcddd
2 | jnloahej ipbcbnop heokehhg
3 | eijocfod nbbeopjo ddhiffmp
4 | cndelncn cmcmkckd aelpmccp
5 | nhjdlned cbkgpggg kgbcifbj
一个table是一个从符号键字典到等长向量列表的字典。使用 "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 tables 有一个虚拟的 i 列,它是行号。这里我使用更新使其可见。
为了逐步解释这段代码,请从右边开始尝试评估每个部分。
一个。在 kdb 中,我们可以调用带有两个参数的函数,如下所示:(x is 3, y is 4)
q){x+y}[3;4]
7
乙。 kdb中的问号可以用来做很多事情,当它左边是数字,右边是`8时,它会生成n个长度为8的随机符号。这里我用:副词修饰函数并调用对于左边的每个项目多次:
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 通过连接字符串并再次使用副词来列名:
q){(`$"vals",/:string til y)}[3;10]
`vals0`vals1`vals2`vals3`vals4`vals5`vals6`vals7`vals8`vals9
D. kdb 中的 table 是翻转字典。一个简单的例子:
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
我使用该技术生成我的 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.最后使用虚拟 i 列更新并使用 xkey 使其成为键控 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
我建议使用此技术分解任何 kdb 代码以尝试理解它。从右到左,查询您不理解的最小部分...直到您理解为止。
我正在做这样的事情:
q)seed:5
q)numvals:3
q)id:`u#1+til seed;
q)vals:numvals cut (seed*numvals)?`8
q)1!([]id;vals)
现在我得到一个 table 这样的:
id| vals
--| --------------------------
1 | bhlkdkfd ghmjjepm gphfcddd
2 | jnloahej ipbcbnop heokehhg
3 | eijocfod nbbeopjo ddhiffmp
4 | cndelncn cmcmkckd aelpmccp
5 | nhjdlned cbkgpggg kgbcifbj
有没有一种方法可以在 table 生成期间自动展开 vals
列表,以创建如下所示的 table:
id| vals0 vals1 vals2
--| --------------------------
1 | bhlkdkfd ghmjjepm gphfcddd
2 | jnloahej ipbcbnop heokehhg
3 | eijocfod nbbeopjo ddhiffmp
4 | cndelncn cmcmkckd aelpmccp
5 | nhjdlned cbkgpggg kgbcifbj
一个table是一个从符号键字典到等长向量列表的字典。使用 "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 tables 有一个虚拟的 i 列,它是行号。这里我使用更新使其可见。
为了逐步解释这段代码,请从右边开始尝试评估每个部分。
一个。在 kdb 中,我们可以调用带有两个参数的函数,如下所示:(x is 3, y is 4)
q){x+y}[3;4]
7
乙。 kdb中的问号可以用来做很多事情,当它左边是数字,右边是`8时,它会生成n个长度为8的随机符号。这里我用:副词修饰函数并调用对于左边的每个项目多次:
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 通过连接字符串并再次使用副词来列名:
q){(`$"vals",/:string til y)}[3;10]
`vals0`vals1`vals2`vals3`vals4`vals5`vals6`vals7`vals8`vals9
D. kdb 中的 table 是翻转字典。一个简单的例子:
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
我使用该技术生成我的 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.最后使用虚拟 i 列更新并使用 xkey 使其成为键控 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
我建议使用此技术分解任何 kdb 代码以尝试理解它。从右到左,查询您不理解的最小部分...直到您理解为止。