如何将KDB+双键字典/双键表转置为矩阵结构?
转置KDB+双键字典/表为矩阵结构
刚好之前处理过类似的KDB+数据结构转换需求,你的思路(两次flip+group)完全找对方向了!咱们一步步来实现你要的矩阵结构:
一、双键字典转矩阵
先假设你的双键字典定义如下(和示例匹配):
d:([x:1 2 3 4 5 1 2 3 4 5 1 2 3 4 5; y:`a`a`a`a`a`b`b`b`b`b`c`c`c`c`c] z:15#`data)
实现步骤:
按
y分组字典:把相同y值的条目聚合在一起,得到以y为键、内部是x-z映射的嵌套字典:grouped: group d比如
grouped[a]会返回1data;2data;3data;4data;5data,完美保留每个x对应的z值。转置每个分组的字典:把每个嵌套字典的键(
x)转成列名,值(z)转成列值:flipped: flip each grouped此时
flipped里的每个y对应一个小表,列就是1-5,值全是data。合并为最终矩阵结构:把
y作为行标识,和转置后的表合并成一个完整的矩阵表:matrixTable: ([] y:key grouped; value flipped)执行后输出的结果完全符合你的需求:
y | 1 2 3 4 5 --|----------------------- a | data data data data data b | data data data data data c | data data data data data
二、双键表转矩阵
如果你的数据是双键表(不管是键表还是普通表),转换逻辑类似,甚至可以用更简洁的方法:
假设你的双键表定义:
// 键表版本 t:([x:1 2 3 4 5 1 2 3 4 5 1 2 3 4 5; y:`a`a`a`a`a`b`b`b`b`b`c`c`c`c`c] z:15#`data) // 普通表版本(非键表) t:([] x:1 2 3 4 5 1 2 3 4 5 1 2 3 4 5; y:`a`a`a`a`a`b`b`b`b`b`c`c`c`c`c; z:15#`data)
方法1:用group+flip(和字典思路一致)
// 先按y分组,提取x和z的对应关系,再转置每个组 matrixT: update flip `x`z!{x,y} from select x,z by y from t
方法2:用内置pivot函数(KDB+ 3.5及以上版本支持)
如果你的KDB+版本较新,直接用内置的pivot函数更高效,参数对应行、列、值的字段:
matrixT: pivot[;`y;`x;`z] t
参数说明:pivot[表; 行字段; 列字段; 值字段],刚好匹配你要的「y为行、x为列、z为值」的矩阵结构,输出结果和方法1完全一致。
补充说明
如果你的数据存在缺失的x-y组合(比如某个y下缺少x=3的条目),可以在分组后用set或fill补全默认值,比如:
// 补全所有x的可能值(假设x范围是1-5) filled: {[g;xs] g set[;xs] fill g} grouped, (key grouped)!{[x] x!count[x]#`null} 1 2 3 4 5
内容的提问来源于stack exchange,提问作者delita
相关产品推荐
相关产品推荐

