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 中的 time 列,将 col4 列 和 col5 列转换为一列:
$ 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(keyColNames=`id`time, valueColNames=`bid1`bid2`bid3`bid4`bid5);
//不保留其它列,仅仅将 ask1~ask5 列转换到一个列
$ t2 = t.unpivot(, valueColNames=`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 |