基于其他列值在kdb中添加列

时间:2017-10-23 09:42:24

标签: kdb q-lang

我在名为test的数据框中有这样的列:

Name    Client
 A       P
 B       Q
 C       R
 D       S
 E       T

我需要在相同的数据帧中创建一个新的列clienttype,其条件是,如果Client = P或Q clienttype = first。如果客户端类型= R或S clienttype = second,依此类推。任何人都可以告诉如何在kdb中这样做?感谢

2 个答案:

答案 0 :(得分:2)

用字典可以解决这个问题吗?

q)update ClientType:(`P`Q`R`S!`first`first`second`second)Client from tab
Name Client ClientType
----------------------
A    P      first
B    Q      first
C    R      second
D    S      second
E    T

对此的扩展:您还可以使用向量条件?[;;]来解决这些类型的问题。不幸的是,在这种情况下会导致许多嵌套的向量条件:

update Clienttype:?[Client in`P`Q;`first;?[Client in`R`S;`second;`third]]from tab
Name Client Clienttype
----------------------
A    P      first
B    Q      first
C    R      second
D    S      second
E    T      third

如果您只有两种可能的选项(例如firstsecond),这种做法可能会很有用。

答案 1 :(得分:1)

您没有告诉我们表格中列的类型,但如果您的所有条目都是单个字母,则最好用q char类型表示:

q)show t:([]Name:"ABCDE";Client:"PQRST")
Name Client
-----------
A    P
B    Q
C    R
D    S
E    T

现在,Clienttype最好存储为可以计算为

的数字
q)update Clienttype:1+(("i"$Client)-"i"$"P")div 2 from t
Name Client Clienttype
----------------------
A    P      1
B    Q      1
C    R      2
D    S      2
E    T      3

或者如果必须使用符号,

q)types:`first`second`third`fourth
q)update Clienttype:types(("i"$Client)-"i"$"P")div 2 from t
Name Client Clienttype
----------------------
A    P      first
B    Q      first
C    R      second
D    S      second
E    T      third