【问题标题】:Reliably parsing/applying a function to tables vs dictionaries in kdb可靠地解析/应用函数到 kdb 中的表和字典
【发布时间】:2020-12-23 13:05:12
【问题描述】:

我正在尝试在 q 中的函数内进行功能选择,如下所示:

dosel:{[tab] ?[tab;enlist(>;`scalar;5);0b;()]};

在表格输入上完美运行,即

q)tab:([]time:2#.z.z;tag:0 0;direction:0 0;scalar:5 10)
q)count tab
2
q).Q.s1 tab
"+`time`tag`direction`scalar!(2020.12.23T12:28:08.254 2020.12.23T12:28:08.254;0 0;0 0;5 10)"
q)dosel tab
time                    tag direction scalar
--------------------------------------------
2020.12.23T12:49:19.885 0   0         10

而且,如预期的那样,不适用于字典表:

q)tab:`time`tag`direction`scalar!(.z.z;0;0;4)
q)count tab
4
q)dosel tab
'type
  [1]  dosel:{[tab] ?[tab;enlist(>;`scalar;5);0b;()]}
                ^

您可以通过使用 enlist 来解决此问题,即

q))dosel enlist tab
time tag direction scalar
-------------------------

但是这有明显的边缘情况,即

q)tab:`time`tag`direction`scalar!(2#.z.z;2#0;2#0;2#4)
q))type tab
99h
q)count tab
4
q).Q.s1 tab
"`time`tag`direction`scalar!(2020.12.23T12:55:48.835 2020.12.23T12:55:48.835;0 0;0 0;4 4)"
q)dosel tab
'type
  [1]  dosel:{[tab] ?[tab;enlist(>;`scalar;5);0b;()]}
                    ^
q)dosel enlist tab
'type
  [4]  dosel:{[tab] ?[tab;enlist(>;`scalar;5);0b;()]}
                    ^
q)dosel flip tab
'type
  [7]  dosel:{[tab] ?[tab;enlist(>;`scalar;5);0b;()]}
                    ^

在上面的示例中可以看到,count 不是表格性质的良好近似值。 如何可靠地将表格/字典数据解析为适当的形式,以便应用 dosel。

抱歉,如果这是一个新手问题...再次感谢。

【问题讨论】:

    标签: kdb


    【解决方案1】:

    您的最后一个示例对我有用,我不确定您为什么会看到错误:

    q)tab:`time`tag`direction`scalar!(2#.z.z;2#0;2#0;2#4)
    q)
    q)dosel flip tab
    time tag direction scalar
    -------------------------
    

    无论哪种方式 - 您的函数设计为在表格上工作,因此您需要确保您的输入始终是表格。这可以通过以下方式实现:

    makeTab:{$[98h=type x;x;@[(flip;enlist)0>type first x;x]]};
    
    q)dosel makeTab ([]time:2#.z.z;tag:0 0;direction:0 0;scalar:5 10)
    time                    tag direction scalar
    --------------------------------------------
    2020.12.23T13:18:58.909 0   0         10
    q)
    q)dosel makeTab `time`tag`direction`scalar!(.z.z;0;0;4)
    time tag direction scalar
    -------------------------
    q)
    q)dosel makeTab `time`tag`direction`scalar!(2#.z.z;2#0;2#0;2#4)
    time tag direction scalar
    -------------------------
    

    这个makeTab 函数假定您将传入一个表或字典,但如果需要,它可以进一步泛化(例如键控表)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-05
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多