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