【问题标题】:How do I convert a dictionary of dictionaries into a table?如何将字典字典转换为表格?
【发布时间】:2021-08-29 10:32:44
【问题描述】:

我有一本字典:

`1`2!((`a`b`c!(1 2 3));(`a`b`c!(4 5 6)))

 | a b c
-| -----
1| 1 2 3
2| 4 5 6

我正在想办法把它变成一个看起来像这样的表格:

1 a 1
1 b 2
1 c 3
2 a 4
2 b 5
2 c 6

在 KDB 中实现这一目标最简单/“正确”的方法是什么?

【问题讨论】:

    标签: kdb


    【解决方案1】:

    不确定这是最短还是最好的方法,但我的解决方案是:

    ungroup flip`c1`c2`c3!
      {(key x;value key each x;value value each x)}
        `1`2!((`a`b`c!(1 2 3));(`a`b`c!(4 5 6)))
    

    这给出了列名c1, c2, c3的预期表

    【讨论】:

      【解决方案2】:

      您实际上要做的是“取消透视” - 请参阅此处的官方数据透视页面:https://code.kx.com/q/kb/pivoting-tables/

      不幸的是,该页面没有提供取消数据透视的功能,因为它不是微不足道的,而且很难找到通用的解决方案,但是如果您在 Kx/K4/community 档案中搜索“取消数据透视”,您会发现unpivot 函数的一些示例,例如 Aaron Davies 的这个:

      unpiv:{[t;k;p;v;f] ?[raze?[t;();0b;{x!x}k],'/:(f C){![z;();0b;x!enlist each (),y]}[p]'v xcol't{?[x;();0b;y!y,:()]}/:C:(cols t)except k;enlist(not;(.q.each;.q.all;(null;v)));0b;()]};
      

      使用它,您的问题(在对输入稍作调整后)变为:

      q)t:([]k:`1`2)!((`a`b`c!(1 2 3));(`a`b`c!(4 5 6)));
      q)`k xasc unpiv[t;1#`k;1#`p;`v;::]
      k v p
      -----
      1 1 a
      1 2 b
      1 3 c
      2 4 a
      2 5 b
      2 6 c
      

      此解决方案可能比您的用例需要的更复杂,因为它试图解决反透视的一般情况。

      【讨论】:

        【解决方案3】:

        只是对此的更新,我以与所选答案不同的方式解决了这个问题。

        最后,我:

        • 将每一行转换为一个表格,其中包含一行和我需要的所有列。
        • 将所有表连接在一起。

        【讨论】:

          猜你喜欢
          • 2011-07-11
          • 2018-08-21
          • 1970-01-01
          • 1970-01-01
          • 2021-08-09
          • 1970-01-01
          • 1970-01-01
          • 2021-08-21
          相关资源
          最近更新 更多