2011-06-16 128 views
4

我看起来像一个数据矩阵:数据列表,数据矩阵MATLAB/R

date ticker return 

2/1 MSFT .21 

2/1 GOOG .11 

2/1 CSCO .09 

2/2 MSFT .22 

2/2 GOOG .19 

2/2 CSCO .15 

,我想结构转移到类似:

 MSFT GOOG CSCO 

2/1 .21 .11 .09 

2/2 .22 .19 .15 

有一个简单的在Matlab/R中进行传输的方法,除了运行循环以获取此信息?

+0

你只是想打印一张表,或者你想在某种数据结构中使用它,以便进一步使用?另外,你的数据矩阵是什么形式?一个文本文件? – Jonas 2011-06-17 01:29:18

回答

5

可以使用reshape2库:

library(reshape2) 

#sample data 
dat <- data.frame(
    date = rep(c("2/1", "2/2"), each = 3) 
    , ticker = rep(c("MSFT", "GOOG", "CSCO"), 2) 
    , return = runif(6) 
) 

#Cast the data 
> dcast(dat, date ~ ticker, value_var = "return") 

    date  CSCO  GOOG  MSFT 
1 2/1 0.2555900 0.6212102 0.43078011 
2 2/2 0.7092036 0.7013563 0.01225488 
+0

谢谢,Chase。它运作良好。 – user802231 2011-06-19 01:17:52

1

,并在MATLAB:

数据,如果加载由textscan:

dates = {'2/1','2/1','2/1','2/2','2/2','2/2'} 
sites = {'MSFT','GOOG','CISCO','MSFT','GOOG','CISCO'} 
vals = rand(1,6); 

重塑:

[uDate,uiDate,ujDate] = unique(dates); 
[uSite,uiSite,ujSite] = unique(sites); 
sz = [length(uDate),length(uSite)]; 
valArray = vals(sub2ind(sz,ujDate,ujSite)) 
valArray = reshape(valArray,sz); 

的价值'2/1''GOOG'现在在

valArray(find(strcmpi('2/1',uDate),1), find(strcmpi('GOOG',uSite),1)) 

不像R那么优雅,但是嘿。 MatrixMultiply函数!

+0

BlessedKey,谢谢你。但我认为这一行:“valArray = reshape(vals,sz);”应改为“valArray = reshape(valArray,sz);”,对吧? – user802231 2011-06-19 01:15:28

+0

是的。你是对的。抱歉。 (编辑)的 – BlessedKey 2011-06-19 01:36:02

1

FOR MATLAB代码,正确的应该是:

dates = {'2/1','2/1','2/1','2/2','2/2','2/2'} 
sites = {'MSFT','GOOG','CISCO','MSFT','GOOG','CISCO'} 
vals = 1:6; 

[uDate,uiDate,ujDate] = unique(dates); 
[uSite,uiSite,ujSite] = unique(sites); 

sz = [length(uDate),length(uSite)]; 

positionIndex=sub2ind(sz,ujDate,ujSite); 

[B,IX] = sort(positionIndex); 

valArray = vals(IX); 
valArray = reshape(valArray,sz); 
0

或者在更一般的情况下,如果人失踪值:

日期= { '2/1','2/1' , '2/1', '2/2', '2/2', '2/2'};网站= {'MSFT','GOOG','CISCO','MSFT','GOOG','CISCO'};以及其他网站。

vals = 1:6;

[uDate,uiDate,ujDate] = unique(dates);

[uSite,uiSite,ujSite] = unique(sites);

sz = [length(uDate),length(uSite)];

positionIndex = sub2ind(sz,ujDate,ujSite);

valArray = zeros(长度(uDate),长度(uSite));

valArray(positionIndex)= vals;

0

如果在原始矩阵中缺少转换前难以检查的数据,上述MATLAB解决方案将无法正常工作。

在Dave的answer我将取代

valArray = vals(IX); 
valArray = reshape(valArray,sz); 

valArray = nan(sz); 
valArray(B) = vals(positionIndex); 

缺失值将NaN的更换。


的r melt/dcast这么多更优雅。爱它!我希望在MATLAB中有类似的工具。