Применить функцию шага к значениям - PullRequest
0 голосов
/ 26 октября 2018

У меня есть следующая таблица:

t:([]sym:`eae`oco`khd`dga`eob`iog`edg`kio`gme`iko; val:1 0 5 1 0 0 1 7 6 3)

sym val
-------
eae 1  
oco 0  
khd 5  
dga 1  
eob 0  
iog 0  
edg 1  
kio 7  
gme 6  
iko 3  

Я хочу назначить некоторое значение bucket в соответствии со следующими правилами:

if 0 <= val < 1, then bucket = 3 
if 1 <= val < 3, then bucket = 8
if 3 <= val < 5, then bucket = 20
if 5 <= val    , then bucket = 30

Так похоже на применение шагафункция до значений val.Полученная таблица должна выглядеть следующим образом:

sym val bucket
--------------
eae 1   8     
oco 0   3     
khd 5   30    
dga 1   8     
eob 0   3     
iog 0   3     
edg 1   8     
kio 7   30    
gme 6   30    
iko 3   20  

Конечно, я не хочу применять if[if[...]], и я ищу элегантное q-ist решение.

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Несмотря на то, что я предпочитаю подход «пошаговая функция-словарь» от @Anonymouse, для полноты информации другой подход заключается в использовании asof join

q)aj[`val;t;([]val:0 1 3 5;bucket:3 8 20 30)]
sym val bucket
--------------
eae 1   8
oco 0   3
khd 5   30
dga 1   8
eob 0   3
iog 0   3
edg 1   8
kio 7   30
gme 6   30
iko 3   20
0 голосов
/ 27 октября 2018

Эта функция называется «пошаговый словарь».Хотя @Anonymouse уже рассмотрел словарь способ его использования, однако, есть также немного другой способ его использования, преобразовав его в ступенчатый keyed-table;это облегчит объединение с любой другой таблицей, используя lj:

q)t:([]sym:`eae`oco`khd`dga`eob`iog`edg`kio`gme`iko; val:1 0 5 1 0 0 1 7 6 3)
q)sd:`s#([val:0 1 3 5] bucket:3 8 20 30)
q)t lj sd
0 голосов
/ 26 октября 2018

работают следующие работы:

update bucket: (`s#0 1 3 5!3 8 20 30)[val] from t 
...