функция возвращает таблицу в kdb / q - PullRequest
0 голосов
/ 29 июня 2018

Я новичок в kdb / q, и я не знаком с функцией kdb \ q, надеюсь, кто-нибудь может мне помочь. Вот вопрос: У меня есть простая функция q, объявленная следующим образом:

func:{[x;y] x+y}

И {[x;y] x+y}[3;4] дает мне ответ 7. Все отлично работает.

Если у меня есть таблица t с двумя столбцами, такими как:

_x   _y
--------
3     4
2     5
6     2
...

Могу ли я иметь функцию в q, которая вычисляет x+y для каждой строки таблицы t? И мой ожидаемый доход будет примерно таким:

res
---
7
7
8
...

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Поскольку + перегружен для работы и с атомом, и со списком, res:func[x;y] будет работать отлично; однако в случаях, когда двоичная функция принимает аргументы только как атомы, а не списки, тогда each-both сделает свое дело:

q)select res:func'[x;y] from tab  // using each-both func'[x;y]
res
---
5
7
9

например, чтобы выбрать столько столбцов, сколько c из столбца s

tab2:([] c:1 2 3;s:("123";"1234";"123456"))
q)update res:#'[c;s] from tab2  //func'[x;y]
c   s         res
-----------------------
1   "123"     enlist "1"
2   "1234"    "12"
3   "123456"  "123"
0 голосов
/ 29 июня 2018

Вы можете просто передать имена столбцов в качестве параметров функции:

q)tab:([]x:1 2 3;y:4 5 6)
q)func:{[x;y] x+y}
q)
q)select res:func[x;y]from tab
res
---
5
7
9

В качестве альтернативы вы можете использовать функциональную форму, чтобы превратить этот запрос в функцию:

q){?[x;();0b;enlist[`res]!enlist(`func;y;z)]}[tab;`x;`y]
res
---
5
7
9
...