Упрощение нескольких операторов обновления - KDB - PullRequest
0 голосов
/ 06 июня 2018

У меня есть таблица, содержащая несколько флагов, я хочу сопоставить каждый из этих флагов значениям, которые они представляют.

tab:([] t:til 4 ; f1:1100b;f2:1010b;f3:0101b;f4:0011b )

Как упростить эти несколько операторов обновления?

tab:update f1s:`googl from tab where f1
tab:update f2s:`appl from tab where f2
tab:update f3s:`amzn from tab where f3

Ответы [ 4 ]

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

Более функциональное решение

q)@/[tab;`f1`f2`f3;(``goog;``appl;``amzn)]
t f1   f2   f3   f4
-------------------
0 goog appl      0
1 goog      amzn 0
2      appl      1
3           amzn 1
0 голосов
/ 06 июня 2018

Этого также можно добиться с помощью словарей:

tab:([] t:til 4 ; f1:1100b;f2:1010b;f3:0101b;f4:0011b )
g:01b!``googl 
ap:01b!``appl 
az:01b!``amzn

update f1s:g@f1, f2s:ap@f2, f3s:az@f3 from tab

Это особенно полезно в тех случаях, когда в одном столбце несколько значений:

q)tab:([] t:til 4 ; f1:1 2 0 4;f2:2 3 4 1;f3:1 4 3 1 ;f4:1 1 0 0 )
q)m:1 2 3!`googl`appl`amzn 
q)update f1s:m@f1, f2s:m@f2, f3s:m@f3 from tab

t f1 f2 f3 f4 f1s   f2s   f3s
-------------------------------
0 1  2  1  1  googl appl  googl
1 2  3  4  1  appl  amzn
2 0  4  3  0              amzn
3 4  1  1  0        googl googl
0 голосов
/ 06 июня 2018

update f1s:``googl f1,f2s:``appl f2,f3s:``amzn f3 from `tab

Вы можете поместить символы в список и использовать логические значения для индексации в нем

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

Вы можете использовать векторный условный оператор ?:

?[vb;exprtrue;exprfalse]

Упрощенное выражение:

update f1s:?[f1;`googl ;`], f2s:?[f2;`appl ;`], f3s:?[f3;`amzn ;`] from tab
...