Kdb q-在表上按行应用函数
给定一个表和一个函数Kdb q-在表上按行应用函数,kdb,q-lang,Kdb,Q Lang,给定一个表和一个函数 t:([] c1:1 2 3; c2:`a`b`c; c3:13:00 13:01 13:02) f:{[int;sym;date] symf:{$[x=`a;1;x=`b;2;3]}; datef:{$[x=13:00;1;x=13:01;2;3]}; r:int + symf[sym] + datef[date]; r }; 我注意到,当将函数f应用于t的列时,整个列被传递到f中,如果它们可以原子操作,那么输出将与输入具有相同的长度
t:([] c1:1 2 3; c2:`a`b`c; c3:13:00 13:01 13:02)
f:{[int;sym;date]
symf:{$[x=`a;1;x=`b;2;3]};
datef:{$[x=13:00;1;x=13:01;2;3]};
r:int + symf[sym] + datef[date];
r
};
我注意到,当将函数f
应用于t
的列时,整个列被传递到f
中,如果它们可以原子操作,那么输出将与输入具有相同的长度,并生成一个新列。但是,在我们的示例中,这不起作用:
update newcol:f[c1;c2;c3] from t / 'type error
因为内部函数symf
和datef
不能分别应用于整个列c2
,c3
如果我根本不想更改函数f,我如何逐行应用它并将值收集到t
中的新列中
做这件事最有风格的方式是什么
编辑
如果不更改f
确实不方便,可以这样解决
f:{[arglist]
int:arglist 0;
sym:arglist 1;
date:arglist 2;
symf:{$[x=`a;1;x=`b;2;3]};
datef:{$[x=13:00;1;x=13:01;2;3]};
r:int + symf[sym] + datef[date];
r
};
f each (t`c1),'(t`c2),'(t`c3)
我仍然对如何在使用原始版本的f
谢谢 您可以为此使用,例如
q)update newcol:f'[c1;c2;c3] from t
c1 c2 c3 newcol
------------------
1 a 13:00 3
2 b 13:01 6
3 c 13:02 9
但是,通过将f修改为“矢量化”,您可能会获得更好的性能,例如
一般来说,在KDB中,如果您可以避免使用任何形式的每种操作并坚持使用向量操作,您将获得更高的效率
q)update newcol:f'[c1;c2;c3] from t
c1 c2 c3 newcol
------------------
1 a 13:00 3
2 b 13:01 6
3 c 13:02 9
但是,通过将f修改为“矢量化”,您可能会获得更好的性能,例如
一般来说,在KDB中,如果您可以避免使用任何形式的每种操作,并坚持使用向量操作,那么您将获得更高的效率