Dataframe KDB和x2B;如何检查所有列的符号是否相同?
我有一个包含以下列的表:日期、名称、现金类型、t1、t2、t3。如果t1、t2和t3列相等,我想添加一个返回布尔值的列 这是可行的,但我必须硬编码t1、t2和t3。列名称根据日期而变化。我想将列Dataframe KDB和x2B;如何检查所有列的符号是否相同?,dataframe,match,kdb,Dataframe,Match,Kdb,我有一个包含以下列的表:日期、名称、现金类型、t1、t2、t3。如果t1、t2和t3列相等,我想添加一个返回布尔值的列 这是可行的,但我必须硬编码t1、t2和t3。列名称根据日期而变化。我想将列dateCols:-3#cols data的列表传递到下面的代码中 update validateSign: {x=/} each flip signum (d2018_05_28; d2018_05_29; d2018_05_30) from data 对于包含变量列名的update语句,需要使用函数
dateCols:-3#cols data
的列表传递到下面的代码中
update validateSign: {x=/} each flip signum (d2018_05_28; d2018_05_29; d2018_05_30) from data
对于包含变量列名的update语句,需要使用函数更新。以下链接包含更多信息:
通常推断函数更新参数的最简单方法是在您提供的示例中使用
parse
函数。在本例中,我们可以使用data dateCols
调用查询中的列列表
update validateSign:{x=/}each flip signum data dateCols from data
然而,我不认为这个查询会产生期望的结果,另一种选择是
update validateSign:1=(count distinct@)each flip signum data dateCols from data
Georges关于原始解决方案给出错误结果的评论是正确的,因为
{x=/}
不会告诉您列表中的所有项都相等,而是一个滚动布尔值,用于检查下一个项是否匹配零或一。像{all x[0]=x}
这样的东西可以实现您想要的
Jemmas指出,如果列名可能不同,并且希望使用select构造,则必须使用以下形式的函数select:
q)data:([] date:10#.z.D;name:10?`4;cashType:10?`A`B;t1:-5+10?10;t2:-5+10?10;t3:-5+10?10)
q)dateCols:-3#cols data
q)![data;();0b;(1#`validateSign)!enlist ({all flip x[;0]=x};(flip signum@;enlist,dateCols))]
date name cashType t1 t2 t3 validateSign
----------------------------------------------
2018.05.31 hjkn B -1 4 0 0
2018.05.31 okdm A 2 0 3 0
2018.05.31 jggp A 3 -3 0 0
2018.05.31 oimo A -1 -2 -3 1
2018.05.31 naea A -1 4 3 0
2018.05.31 jadb B 1 0 1 0
2018.05.31 nojg A 4 4 4 1
2018.05.31 keno B 4 2 -5 0
2018.05.31 hdai B -3 1 -5 0
2018.05.31 mfmf A 0 1 -5 0
这种在数据表上的select中索引数据表的方法不是一种好的做法。