Добавить столбец в таблицу в KDB на основе существующих столбцов?
Я хочу добавить новый столбец в таблицу KDB, он должен добавить на основе существующего столбца, заполнив ненулевое значение, как показано ниже
q)t:([]a:`a`b`c`d`e`f`g`h;b:1 0n 3 4 0n 6 0n 8;c:0n 2 0n 0n 5 0n 7 0n)
q)t
a b c
-----
a 1
b 2
c 3
d 4
e 5
f 6
g 7
h 8
Я хочу добавить столбец d, который будет принимать значение из c или d, которое не является нулевым, для создания таблицы, подобной этой
a b c d
-------
a 1 1
b 2 2
c 3 3
d 4 4
e 5 5
f 6 6
g 7 7
h 8 8
Я попытался объединить, но тогда в нем есть нуль:
q)update d:(b,'c)from t
a b c d
----------
a 1 1
b 2 2
c 3 3
d 4 4
e 5 5
f 6 6
g 7 7
h 8 8
4 ответа
Условный вектор может быть тем, что вы ищете, что-то вроде ниже:
update d:?[null b;c;b] from t
Вы можете прочитать больше о векторных условных выражениях здесь. Это ожидает логический список в качестве первого аргумента и возвращает значения из списка во втором аргументе, где True, или значения из списка в третьем аргументе, где False. Например:
q)?[10101b;”abcde”;”ABCDE”]
“aBcDe”
При использовании в сочетании с оператором выбора / обновления столбцы таблицы могут быть указаны в качестве аргументов условного вектора, поскольку это просто списки.
Помимо этого, null
Ключевое слово возвращает логическое значение true, где значение равно нулю и полезно как часть вашего решения.
Вы можете использовать ^
(заполнить) оператор.
t:([]a:`a`b`c`d`e`f`g`h;b:1 0n 3 4 0n 6 0n 8;c:0n 2 0n 0n 5 0n 7 0n)
q)update d:b^c from t
a b c d
-------
a 1 1
b 2 2
c 3 3
d 4 4
e 5 5
f 6 6
g 7 7
h 8 8
Стоит отметить, что если у вас была строка с ненулевыми значениями для b
а также c
тогда запрос выше будет по умолчанию к значению в c
, Если вы предпочитаете значение в b
по умолчанию, затем переключите входы:
q)t:([]a:`a`b`c`d`e`f`g`h;b:1 0n 3 4 0n 6 0n 8;c:0n 2 0n 0n 5 100 7 0n)
q)update d:b^c from t
a b c d
-----------
a 1 1
b 2 2
c 3 3
d 4 4
e 5 5
f 6 100 100
g 7 7
h 8 8
q)update d:c^b from t
a b c d
---------
a 1 1
b 2 2
c 3 3
d 4 4
e 5 5
f 6 100 6
g 7 7
h 8 8
Можете заполнить здесь - https://code.kx.com/wiki/Reference/Caret
q)t:([]a:`a`b`c`d`e`f`g`h;b:1 0n 3 4 0n 6 0n 8;c:0n 2 0n 0n 5 0n 7 0n)
q)update d:c^b from t
a b c d
-------
a 1 1
b 2 2
c 3 3
...
Вы можете использовать оператор "или (|)".
q)update d:b|c from t
Concat выдаст вам список элементов из столбцов "b" и "c". Это не удалит ноль. 'or' сравнивает каждую пару 'b' и 'c' и возвращает максимальное значение из этой пары. Так как ноль меньше целого числа, он даст вам целочисленное значение из столбца "b" или "c".