我是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
...
非常感谢!
答案 0 :(得分:3)
您只需将列名作为参数传递给函数:
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
答案 1 :(得分:1)
由于+
被重载以同时与atom和list一起使用,因此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"