matlab split dataset,matlab如何将数据转化为dataset格式

匿名用户

1级

2011-02-16 回答

在数据处理当中,我们经常碰到数据集合并的需要。在一些语言如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

struct、cell array、dataset都属于带有OO思想的几个数据类型,在处理统计的数据整理的时候,dataset可以较为方便的与panel类的数据处理自然融合,如果说速度的话,可能是struct稍微快些,但这三者中最基本的却是cell array,它的处理最类似矩阵,但是在统计数据的处理中有时候引用还是不太方便或容易搞混掉,特别是在数据比较多,且是不是修改的情况下,用名字引用更好些。

在数据转换方面,三者之间可以完全自然的转换,包括含有自定义对象的情况下,都没有什么问题。

但在目前的实际使用中,觉得如果是对多家企业的分析,可能还是struct array作为函数的传递是最方便的,当然,如果要抽取panel数据的话,可以考虑转换为dataset或cell。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值