在数据处理当中,我们经常碰到数据集合并的需要。在一些语言如SAS,SQL中,数据集合并是一个非常简单的问题,但是在Matlab中,数据集合并则显得稍微复杂了一点。

在Matlab中,要想合并数据,有两个办法,第一个办法就是使用dataset这种数据类型,这个statistic toolbox中的数据类型,专门为统计分析开发的。mat,cell,等数据类型转换成dataset数据类型可以查看 mat2dataset,cell2dataset函数。当然,也可以直接定义dataset数据集。有了dataset数据类型,那么就可以使用join函数进行数据合并。还有另外一种办法就是对于金融序列数据,可以使用Financial toolbox中的merge函数,前提是数据类型为金融时间序列对象。本文主要讨论join函数如何合并数据。

[C,IA,IB]= join(A,B,param1,val1,param2,val2,...)

参数一Keys &&LeftKeys,RightKeys

在join这个函数中,首先要输入的参数是Keys。这个一般为一个变量名,作为数据合并的标准。当Keys为变量名时,A,B中必须要都有这个变量。否则应该使用LeftKeys和RightKeys这两个参数,LeftKeys指定A中某个变量作为合并依据,RightKeys指定B中某个变量作为合并依据 。请看下面的例子。a、b是一个dataset类型数据,a包含了变量Key1,Var1;b包含了变量Key2,Var2;

a = dataset({'a' 'b' 'c' 'e' 'h'}',[1 2 3 11 17]','VarNames',{'Key1'

'Var1'})

b = dataset({'a' 'b' 'd' 'e'}',[4 5 6 7]','VarNames',{'Key1'

'Var2'})

a =

Key1       Var1

'a'         1

'b'         2

'c'         3

'e'        11

'h'        17

b =

Key1       Var2

'a'        4

'b'        5

'd'        6

'e'        7

现在我们想合并两个数据集,以Key1作为合并依据,那么

c=

join(a,b,'key','Key1','Type','inner','MergeKeys',true)

c =

Key1       Var1    Var2

'a'         1      4

'b'         2      5

'e'        11

7

但是当a,b中的变量不同时,例如b中的Key1不叫Key1,而是叫Key2,那么怎么合并呢,应该使用使用LeftKeys和RightKeys代替Keys.举个例子:

a = dataset({'a' 'b' 'c' 'e' 'h'}',[1 2 3 11 17]','VarNames',{'Key1'

'Var1'})

b = dataset({'a' 'b' 'd' 'e'}',[4 5 6 7]', 'VarNames',{'Key2' 'Var2'})

%注意Key1变成了Key2

c=

join(a,b,'LeftKeys','Key1','RightKeys','Key2','Type','inner','MergeKeys',true)

结果是

c =

Key1_Key2    Var1

Var2

'a'           1      4

'b'           2      5

'e'          11      7

参数二Type

Type参数描述的是我们合并的方式,是返回两个数据中共有的部分,还是返回两个数据集中所有的观测值,或者返回某个数据集中的所有观测值。Type共有四个参数值,inner,outer,leftouter,rightouter.

首先我们看一下Type参数值为inner时候的结果

cinner = join(a,b,'key','Key1','Type','inner','MergeKeys',true)

cinner =

Key1       Var1    Var2

'a'         1      4

'b'         2      5

'e'        11      7

结果返回a,b中Key1都有的‘a’,’b’,’c’的观测值。所以inner表示返回两个数据集的共有部分。

再看一下Type为outer时候的结果

couter =

Key1       Var1    Var2

'a'          1       4

'b'          2       5

'c'          3     NaN

'd'        NaN       6

'e'         11       7

'h'         17     NaN

很显然,a中Key1变量没有d这个值,b中Key1没有c,h这个值,但是结果中还是包含了这些观测值。所以outer表示返回数据集的所有观测值。

leftouter,与outer的区别在于leftouter表示,当A中有一个关键变量值而A中却没有的时候,依然返回该观测值。例如

cleftouter =

join(a,b,'key','Key1','Type','leftouter', 'MergeKeys',true)

cleftouter =

Key1       Var1    Var2

'a'         1        4

'b'         2        5

'c'         3      NaN

'e'        11        7

'h'        17

NaN

所以leftouter返回A中所有的观测值。

rightouter这个参数值则和leftouter这个相反。

crightouter

= join(a,b,'key','Key1','Type','rightouter', 'MergeKeys',true)

crightouter

=

Key1

Var1    Var2

'a'

1     4

'b'

2     5

'd'

NaN     6

'e'

11     7

参数三MergeKeys

最后我们看一下MergeKeys这个参数,故名思议,这个参数表示是否合并关键变量。当MergeKeys为true时,结果只返回一个关键变量。当MergeKeys为false时,结果返回两个关键变量,一个来自与A,一个来自与B.让我们看一下这个例子

couter =

join(a,b,'key','Key1','Type','inner', 'MergeKeys',false)

couter =

Key1_left

Var1    Key1_right    Var2

'a'           1      'a'           4

'b'           2      'b'           5

'e'

11      'e'           7

couter =

join(a,b,'key','Key1','Type','inner', 'MergeKeys',true)

couter =

Key1

Var1    Var2

'a'

1      4

'b'

2      5

'e'

11      7

输出项[C IA IB]

C为返回的数据集,IA,IB分别为索引,A(IA,varName)对应着C中含有A数据集的元素。例如

[c,IA,IB]=join(a,b,'LeftKeys','Key1','RightKeys','Key2','Type','inner','MergeKeys',true)

c =

Key1_Key2

Var1    Var2

'a'           1      4

'b'           2      5

'e'

11      7

IA =

1

2

4

IB =

1

2

4

>>

a(IA,:)

ans =

Key1

Var1

'a'

1

'b'

2

'e'

11

本文最后总结jion函数的参数用法如下表 。

Keys

一般为A,B中的变量名

关键变量,以该变量作为合并的标准。

LeftKeys

RightKeys

LeftKeys:A中的变量名

RightKeys:B中的变量名

指定A中的某变量和B中的某变量作为合并的关键变量。

Type

inner

以关键变量为依据,返回共有的部分

outer(fullouter)

以关键变量为依据,返回所有的观测值。

rightouter

返回B中所有的观测值

Leftouter

返回A中所有的观测值

MergeKeys

true

合并关键变量

false

不合并关键变量(默认)

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐