【问题标题】:KDB+ / Q Table creation with dynamic number of columns使用动态列数创建 KDB+ / Q 表
【发布时间】:2015-05-31 11:49:42
【问题描述】:

我正在做这样的事情:

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

【问题讨论】:

    标签: list kdb q-lang


    【解决方案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 列,即行号。在这里,我使用更新使其可见。

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

    A.在 kdb 中,我们可以调用带有两个参数的函数,如下所示:(x is 3, y is 4)

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

    B. 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.通过连接字符串并再次使用副词来生成列名:

    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
    

    E.最后使用虚拟 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 代码以尝试理解它。从右到左工作,查询您不理解的最小部分......直到您知道为止。

    【讨论】:

    • 噗……谢谢!它有效,但是puuuuuh ..你介意解释一下吗。喜欢阅读该行会发生什么?
    • 刚刚增加了一些questios..那些与这个有关。这就是为什么我要添加它here
    • 关于这张桌子还有一件事。虚拟 i 索引,它是否持久,我的意思是如果我重新排序表,该索引是否仍可用作主键?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多