如何在 kdb q table 中按列计算空条目?

How can I count the null entries by column in a kdb q table?

如果 table 包含多个空条目,我如何创建一个摘要 table 来描述每列的空条目数?这可以在列数和列名事先未知的一般 table 上完成吗?

q)t: ([] a: 1 2 3 4; b: (2018.10.08; 0Nd; 2018.10.08; 2018.10.08); c: (0N;0N;30;40); d: `abc`def``jkl)
q)t
a b          c  d
-------------------
1 2018.10.08    abc
2               def
3 2018.10.08 30
4 2018.10.08 40 jkl

预期结果:

columnName nullCount
--------------------
a          0
b          1
c          2
d          1

你可以table使用

q)flip `columnName`nullCount!(key;value)@\:sum null t
columnName nullCount
--------------------
a          0
b          1
c          2
d          1

其中 sum null t 给出每列中空值的字典

q)sum null t
a| 0
b| 1
c| 2
d| 1

然后我们将列名用作键并翻转到 table。

要生成一个 table,其中的列为 headers,空值数和您可以使用的值:

q)tab:enlist sum null t

它征集了一个字典,其中空值的数量作为值,列名作为键:

    a b c d
    -------
    0 1 2 1

如果您随后想要以给定格式使用此文件,则可以使用:

result:([]columnNames:cols tab; nullCount:raze value each tab)

虽然 sum null t 是本例中最简单的解决方案,但它不处理字符串(或嵌套)列。例如,要处理字符串或嵌套列,您需要

q)t: ([] a: 1 2 3 4; b: (2018.10.08; 0Nd; 2018.10.08; 2018.10.08); c: (0N;0N;30;40); d: `abc`def``jkl;e:("aa";"bb";"";()," "))
q){sum$[0h=type x;0=count@'x;null x]}each flip t
a| 0
b| 1
c| 2
d| 1
e| 1