首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将step函数应用于值

将step函数应用于值
EN

Stack Overflow用户
提问于 2018-10-26 00:53:56
回答 3查看 340关注 0票数 1

我有下表:

代码语言:javascript
运行
复制
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值:

代码语言:javascript
运行
复制
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应用step函数。生成的表应该如下所示:

代码语言:javascript
运行
复制
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解决方案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-26 01:21:10

以下工作:

代码语言:javascript
运行
复制
update bucket: (`s#0 1 3 5!3 8 20 30)[val] from t 
票数 5
EN

Stack Overflow用户

发布于 2018-10-26 12:51:28

虽然我更喜欢@Anonymouse的步骤函数字典方法,但为了完整起见,另一种方法是使用asof join。

代码语言:javascript
运行
复制
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
票数 2
EN

Stack Overflow用户

发布于 2018-10-27 19:47:54

这个特征叫做“分步词典”。尽管@Anonymouse已经介绍了使用它的字典方式,但是,通过将它转换为分步keyed-table,使用它也有一种稍微不同的方法;这将使使用lj连接任何其他表变得更加容易。

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52999973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档