unpivot
语法
unpivot(obj, keyColNames, valueColNames, [func])
参数
obj 是一个表。
keyColNames 是表示列名的标量或向量,用于指定要在输出表中保留的列。
valueColNames 是一个列名向量。valueColNames 中的数据将转换成一列。 请注意 valueColNames 各列的数据类型应一致。
func 是一个函数。如果指定了 func 函数,该函数将会应用到 valueColNames 上,再将其合并。
详情
把多列的数据转换成一列。
返回一个表,列的顺序依次为 keyColNames 指定的各列,valueType 列和 value 列。其中,若未指定 func 参数,则 valueType 列存储 valueColNames 中的列名,否则 ,valueType 列存储 func 应用于 valueColNames 中各列的结果;value 列存储 valueColNames 中各列的值。
例子
t=table(1..3 as id, 2010.01.01 + 1..3 as time, 4..6 as col1, 7..9 as col2, 10..12 as col3, `aaa`bbb`ccc as col4, `ddd`eee`fff as col5, 'a' 'b' 'c' as col6);
t;
id | time | col1 | col2 | col3 | col4 | col5 | col6 |
---|---|---|---|---|---|---|---|
1 | 2010.01.02 | 4 | 7 | 10 | aaa | ddd | 'a' |
2 | 2010.01.03 | 5 | 8 | 11 | bbb | eee | 'b' |
3 | 2010.01.04 | 6 | 9 | 12 | ccc | fff | 'c' |
保留表 t 中的 id 列,将 col1 列和 col2 列转换为一列:
t.unpivot(keyColNames=`id, valueColNames=`col1`col2);
id | valueType | value |
---|---|---|
1 | col1 | 4 |
2 | col1 | 5 |
3 | col1 | 6 |
1 | col2 | 7 |
2 | col2 | 8 |
3 | col2 | 9 |
保留表 t 中的 id 列,将 col1 列和 col2 列转换为一列,且将自定义函数应用于 col1 列和 col2 列:
f = def(x): x.split("col")[1];
t.unpivot(keyColNames=`id, valueColNames=`col1`col2, func=f);
id | valueType | value |
---|---|---|
1 | 1 | 4 |
2 | 1 | 5 |
3 | 1 | 6 |
1 | 2 | 7 |
2 | 2 | 8 |
3 | 2 | 9 |
不保留其它列,仅仅将 col1 列和 col2 列转换为一列:
t.unpivot(, valueColNames=`col1`col2);
valueType | value |
---|---|
col1 | 4 |
col1 | 5 |
col1 | 6 |
col2 | 7 |
col2 | 8 |
col2 | 9 |
保留表 t 中的 id 列,将 col1 列、col2 列 和 col3 列转换为一列,且将自定义函数应用于 col1 列、col2 列和 col3 列:
f = def(x): x.regexReplace("col", "var")
t.unpivot(keyColNames=`id, valueColNames=`col1`col2`col3, func=f);
id | valueType | value |
---|---|---|
1 | var1 | 4 |
2 | var1 | 5 |
3 | var1 | 6 |
1 | var2 | 7 |
2 | var2 | 8 |
3 | var2 | 9 |
1 | var3 | 10 |
2 | var3 | 11 |
3 | var3 | 12 |
t.unpivot(keyColNames=`time, valueColNames=`col4`col5)
time | valueType | value |
---|---|---|
2010.01.02 | col4 | aaa |
2010.01.03 | col4 | bbb |
2010.01.04 | col4 | ccc |
2010.01.02 | col5 | ddd |
2010.01.03 | col5 | eee |
2010.01.04 | col5 | fff |
t = table(1..3 as id, 2010.01.01 + 1..3 as time, 8.1 9.2 11.3 as bid1, 12.4 11.1 10.5 as bid2, 10.1 10.2 10.3 as bid3, 10.1 10.2 10.3 as bid4, 10.1 11.2 9.3 as bid5, 7.7 8.2 10.5 as ask1, 11.4 10.1 9.5 as ask2, 9.6 9.2 11.3 as ask3, 12.1 7.2 8.3 as ask4, 10.1 12.5 8.9 as ask5);
t;
//保留 id 和 time 列,将 bid1~bid5 列转换到一个列
t1 = t.unpivot(`id`time, `bid1`bid2`bid3`bid4`bid5);
//不保留其它列,仅仅将 ask1~ask5 列转换到一个列
t2 = t.unpivot(, `ask1`ask2`ask3`ask4`ask5);
//分别将 t1 和 t2 的 valueType 和 value 列重命名后进行合并
re = rename!(t1, `valueType`value, `bid_type`bid_value) join rename!(t2, `valueType`value, `ask_type`ask_value)
re;
id | time | bid_type | bid_value | ask_type | ask_value |
---|---|---|---|---|---|
1 | 2010.01.02 | bid1 | 8.1 | ask1 | 8.1 |
2 | 2010.01.03 | bid1 | 9.2 | ask1 | 9.2 |
3 | 2010.01.04 | bid1 | 11.3 | ask1 | 11.3 |
1 | 2010.01.02 | bid2 | 12.4 | ask2 | 12.4 |
2 | 2010.01.03 | bid2 | 11.1 | ask2 | 11.1 |
3 | 2010.01.04 | bid2 | 10.5 | ask2 | 10.5 |
1 | 2010.01.02 | bid3 | 10.1 | ask3 | 10.1 |
2 | 2010.01.03 | bid3 | 10.2 | ask3 | 10.2 |
3 | 2010.01.04 | bid3 | 10.3 | ask3 | 10.3 |
1 | 2010.01.02 | bid4 | 10.1 | ask4 | 10.1 |
2 | 2010.01.03 | bid4 | 10.2 | ask4 | 10.2 |
3 | 2010.01.04 | bid4 | 10.3 | ask4 | 10.3 |
1 | 2010.01.02 | bid5 | 10.1 | ask5 | 10.1 |
2 | 2010.01.03 | bid5 | 11.2 | ask5 | 11.2 |
3 | 2010.01.04 | bid5 | 9.3 | ask5 | 9.3 |