KDB:select 并四舍五入每一行

KDB: select and round off each row

我创建了自己的舍入函数:

.q.rnd:{$[x < 0; -1; 1] * floor abs[x] + 0.5}

我有一个 table 测试,字符串列为 COL

select  "F"$(COL) from Test

24549.18741328
48939.50717263
-274853.33568872
-24549.18741328
298753.62574861
84822.70074144
-7468840.64371524
117944.21228603
-117944.21228603
7468840.64371524
-7468840.64371524

我想导出一个 table 来对 Test

中的记录进行四舍五入

有人会认为下面的陈述是可行的。但事实并非如此。

select .q.rnd "F"$(COL) from Test

我收到错误 "type"。那么我该如何对记录进行四舍五入呢?

if-else 条件的结果必须是原子布尔值。当您在列上 运行 .q.rnd 时,您正在对列表进行操作,而 x<0 将要 return 布尔列表,而不是原子。向量条件是 ?

尽管如此,看起来你还是想要一个结果 integer/long,所以在这里使用 parse

q)t:([]string (10?-1 1)*10?10000f)
q)select  "F"$x from t
x
-------------------
4123.1701336801052
-9877.8444156050682
-3867.3530425876379
7267.8099689073861
4046.5459413826466
-8355.0649625249207
6427.3701561614871
-5830.2619284950197
1424.9352994374931
-9149.8820902779698
q)select  "j"$"F"$x from t
x
-----
4123
-9878
-3867
7268
4047
-8355
6427
-5830
1425
-9150

补充一下 Sean 所说的,如果您也想使用您的函数,您可以使用 each,它将 .q.rnd 应用到列表中的每个项目。

q)select .q.rnd each "F"$x from t
x
-----
-3928
5171
5160
-4067
-1781
3018
-7850
5347
-7112
-4116

但是使用 select "F"$x from t 更好,因为它是矢量化的。

q)\t:1000 select "j"$"F"$x from t
22
q)\t:1000 select .q.rnd each "F"$x from t
33

还应注意,.q 命名空间不是必需的,而是 "reserved for kx use"。许多默认的 q 函数都在 .q 命名空间中,未来的 kdb 更新总是有可能添加一个具有不同行为的 .q.rnd,并且会破坏您使用函数的任何代码。