2011-06-16 111 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中有類似的工具。