Создайте логический столбец, отображающий сравнение двух других столбцов в kdb+.

В настоящее время я изучаю kdb+/q. У меня есть таблица данных. Я хочу взять 2 столбца данных (только числа), сравнить их и создать новый логический столбец, который будет отображать, больше ли значение в столбце 1 или равно значению в столбце 2.

Мне удобно использовать команду update для создания нового столбца, но я не знаю, как убедиться, что он является логическим, как сравнить значения и метод для отображения «больше или равно» "- можно ли для этого сделать простой вывод Y/N?

Спасибо.


person Jonathan    schedule 14.06.2017    source источник


Ответы (3)


Используйте условное векторное выражение: http://code.kx.com/q/ref/lists/#vector-conditional

    q)t:([]c1:1 10 7 5 9;c2:8 5 3 4 9)
    q)r:update goe:?[c1>=c2;1b;0b] from t
    c1 c2 goe
    -------------
    1  8  0
    10 5  1
    7  3  1
    5  4  1
    9  9  1

Используйте мета, чтобы подтвердить, что столбец goe имеет логический тип:

  q)meta r
   c      | t f a
   -------| -----
   c1     | j
   c2     | j
   goe    | b
person jomahony    schedule 14.06.2017
comment
Фантастика, и спасибо. Как обычно с такими вещами, это намного проще, чем я себе представлял. - person Jonathan; 14.06.2017
comment
Как бы то ни было, вам не нужен векторный условный оператор. Использование оператора «больше чем» создаст для вас список логических значений update goe:c1>=c2 from t - person Conor Cadogan; 15.06.2017

Операция <= хорошо работает с векторами, но в некоторых случаях, когда функции требуются атомы в качестве входных данных для выполнения операции, вы можете использовать ' (оператор each-both).

например Чтобы сравнить длину строки символов с другим значением столбца

q)f:{x<=count string y}
q)f[3;`ab]
0b

q)t:([] l:1 2 3; s: `a`bc`de)
q)update r:f'[l;s] from t
l s  r
------
1 a  1
2 bc 1
3 de 0
person nyi    schedule 03.06.2018

person    schedule
comment
Благодарю вас! Еще один простой метод. Большая помощь. - person Jonathan; 14.06.2017
comment
Это было бы немного быстрее, чем принятый ответ - person Manish Patel; 15.06.2017