Изменить форму [столбцов; таблицы]

#kdb #k

#kdb #k

Вопрос:

Как мне получить столбцы из таблицы? Если они не существуют, их можно получить в виде нулевых столбцов.

Попытка reshape# :

 q)d:`a`b!1 2
q)enlist d
a b
---
1 2
q)`a`c#d
a| 1
c|
q)`a`c#enlist d
'c
  [0]  `a`c#enlist d
           ^
 

Почему reshape# оператор не работает с таблицей? Он может легко воздействовать на каждую строку (которая является dict) и объединять результаты. Поэтому я вынужден писать:

 q)`a`c#/:enlist d
a c
---
1
 

Это самый короткий путь?

Ответ №1:

Любому ключу, который вы пытаетесь взять ( # ), которого нет в словаре, будет присвоено нулевое значение того же типа, что и первое значение в словаре. Аналогичное поведение недоступно для таблиц.

 q)`a`c#`a`b!(1 2;())
a| 1 2
c| `long$()
q)`b`c#`a`b!(();1 2)
b| 1 2
c| ()
 

Как вы уже упоминали, использование each-right ( /: ) будет действовать на каждую строку таблицы, то есть на каждый словарь. Вместо того, чтобы использовать итератор для разделения таблицы на словари, мы можем воздействовать на сам словарь. Это вернет тот же результат и будет немного быстрее.

 q)d:`a`b!1 2
q)enlist`a`c#d
a c
---
1
q)(`a`c#/:enlist d)~enlist`a`c#d
1b
q)ts:1000000 enlist`a`c#d
395 864
q)ts:1000000 `a`c#/:enlist d
796 880