Kdb 对值应用阶跃函数

Kdb 对值应用阶跃函数,kdb,Kdb,我有下表: 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 &

我有下表:

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
当然,我不想应用
if[if[…]
,我正在寻找一个优雅的q-ist解决方案。

以下方法有效:

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

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

尽管我更喜欢@Anonymouse的step函数字典方法,但为了完整性,另一种方法是使用asof连接

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

尽管我更喜欢@Anonymouse的step函数字典方法,但为了完整性,另一种方法是使用asof连接

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

此功能称为“阶梯字典”。尽管@Anonymouse已经介绍了使用它的字典方式,但是也有一种稍微不同的使用方式,将它转换为一个分级的
键控表
;这将使使用
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

此功能称为“阶梯字典”。尽管@Anonymouse已经介绍了使用它的字典方式,但是也有一种稍微不同的使用方式,将它转换为一个分级的
键控表
;这将使使用
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