首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从矩阵中“按列分组”行?

如何从矩阵中“按列分组”行?
EN

Stack Overflow用户
提问于 2012-10-31 08:59:08
回答 1查看 206关注 0票数 0

我正在尝试从矩阵中“按列分组”数据。

数据是从数据库中提取出来的,矩阵如下所示:

代码语言:javascript
复制
'2012-04-26'    'USD'    'BRL'    [    1.8894]
'2012-04-26'    'USD'    'IDR'    [      9185]
'2012-04-26'    'USD'    'INR'    [   52.5350]
'2012-04-26'    'USD'    'MXN'    [   13.2337]
'2012-04-26'    'USD'    'PEN'    [    2.6505]
'2012-04-26'    'USD'    'SGD'    [    1.2412]
'2012-04-26'    'USD'    'TRY'    [    1.7643]
'2012-04-27'    'USD'    'BRL'    [    1.8846]
'2012-04-27'    'USD'    'IDR'    [      9189]
'2012-04-27'    'USD'    'INR'    [   52.5600]
'2012-04-27'    'USD'    'MXN'    [   13.0147]
'2012-04-27'    'USD'    'PEN'    [    2.6395]
'2012-04-27'    'USD'    'SGD'    [    1.2385]
'2012-04-27'    'USD'    'TRY'    [    1.7600]

(这是一个cell-array)

我想要做的是按日期(第一行)对所有数据进行分组,然后为每个值分配一列,如下所示:

代码语言:javascript
复制
'2012-04-26'    [    1.8894]    [      9185]    [   52.5350]    [   13.2337]    [    2.6505]    [    1.2412]    [    1.7643]    
'2012-04-27'    [    1.8846]    [      9189]    [   52.5600]    [   13.0147]    [    2.6395]    [    1.2385]    [    1.7600]

其中每一行代表一个货币对(USD/BRL,USD/IDR,USD/INR,...)

请注意,对于每个日期,它们在提取的数据中的行数(货币对)完全相同。

在Matlab中有没有一种优雅(且快速)的方法来实现这一点?

谢谢,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-31 09:28:44

鉴于您在这个问题中强调了速度的重要性,我提出了以下解决方案:

代码语言:javascript
复制
%# Build an example cell array 
D = cell(6, 4);
for t = 1:3; D{t, 1} = '2012-04-26'; D{t, 2} = 'A'; D{t, 3} = 'A'; D{t, 4} = t; end;
for t = 4:6; D{t, 1} = '2012-04-27'; D{t, 2} = 'A'; D{t, 3} = 'A'; D{t, 4} = t; end;

%# My Solution
X = [datenum(D(:, 1), 'yyyy-mm-dd'), cell2mat(D(:, 4))];
[UniqueDate, ~, Index] = unique(X(:, 1));
NumObsPerDay = sum(Index == 1);
NumDay = length(UniqueDate);
Soln = [UniqueDate, reshape(X(:, 2), NumObsPerDay, NumDay)'];

在第一行中,我将重要的数据提取到一个数字数组中。数值数组的运算速度比单元数组快得多,因为单个元素占用的内存要少得多。为了处理日期字符串,我在第一步中将它们转换为matlab numerical date format。如果您计划经常使用Matlab,我建议您熟悉数字日期格式,因为它比使用字符串灵活得多-例如,您可以对数字日期格式执行任何类型的算术。

在第二行中,我得到了一个唯一的日期列表和一个索引。

在第三和第四行中,我使用索引来获取您拥有数据的天数,以及每一天的观察数。CAUTIONNumObsPerDay = sum(Index == 1);这一行隐含地假设你每天都有相同数量的观察值(即其他货币)。然而,你在问题中声明情况就是这样,所以我相信你的话:-)

在第五行中,我创建了一个具有所需格式的数值矩阵。第一列是在第2行中获得的惟一日期向量,其余列是通过重塑X中的数据获得的。警告:此行隐含地假设您的单元格数组中的货币顺序每天都是相同的。再一次,我做了这个假设,因为在你的样本数据中是真的,你说你想要一个快速的解决方案。

最后的警告:如果违反了上面所做的任何一个假设,则此代码将失败,或者您的数据将会混淆。换句话说,如果您确定您的所有数据都符合您提供的样本,那么这个解决方案应该是有效的,而且应该是快速的。但是如果你不确定,那么这对你来说不是一个好的解决方案。

ps如果您想再次看到字符串格式的日期,只需使用datestr(Soln(:, 1), 'yyyy-mm-dd');

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13149795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档