【问题标题】:data list to data matrix matlab/R数据列表到数据矩阵 matlab/R
【发布时间】:2011-06-16 20:12:42
【问题描述】:

我有一个数据矩阵,如下所示:

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 中是否有一种简单的方法来进行这种传输,而不是运行循环来获得这个?

【问题讨论】:

  • 您只是想打印一个表格,还是希望在某种数据结构中将其用于进一步的目的?另外,你的数据矩阵是什么形式的?文本文件?

标签: r matlab data-structures matrix


【解决方案1】:

您可以使用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

【讨论】:

    【解决方案2】:

    在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 那样优雅,但是嘿。矩阵乘法!

    【讨论】:

    • BlessedKey,也谢谢你。但我认为这条线:“valArray = reshape(vals,sz);”应该改成“valArray = reshape(valArray,sz);”吧?
    【解决方案3】:

    对于 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);
    

    【讨论】:

      【解决方案4】:

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

      日期 = {'2/1','2/1','2/1','2/2','2/2','2/2'};

      站点 = {'MSFT','GOOG','CISCO','MSFT','GOOG','CISCO'};

      vals = 1:6;

      [uDate,uiDate,ujDate] = 唯一(日期);

      [uSite,uiSite,ujSite] = 唯一(站点);

      sz = [长度(uDate),长度(uSite)];

      positionIndex=sub2ind(sz,ujDate,ujSite);

      valArray=zeros(length(uDate),length(uSite));

      valArray(positionIndex)=vals;

      【讨论】:

        【解决方案5】:

        如果原始矩阵中缺少转换前难以检查的数据,上述 MATLAB 解决方案将不起作用。

        在 DAVE 的 answer 中,我将替换

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

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

        缺失值将被 NaN 替换。


        R 的melt/dcast 更加优雅。爱它!我希望在 MATLAB 中有类似的工具。

        【讨论】:

          猜你喜欢
          • 2015-07-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-17
          • 1970-01-01
          • 2017-10-02
          相关资源
          最近更新 更多