数据列表转换为数据矩阵 Matlab/R

4

我有一个数据矩阵,长这样:

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中完成此转移,而不是运行循环以获取此内容?

你只是想打印一个表格,还是想要将其放入某种数据结构中,以便进一步使用?此外,你的数据矩阵是以什么形式存在的?是文本文件吗? - Jonas
5个回答

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

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


BlessedKey,也谢谢你。但我认为这一行:“valArray = reshape(vals,sz);”应该改成“valArray = reshape(valArray,sz);”,对吧? - user802231

1

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

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

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

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

valArray(positionIndex)=vals;


0

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

在DAVE的答案中,我会进行替换。

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

使用

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

缺失值将被替换为NaN。


R的melt/dcast非常优雅。喜欢它!我希望在MATLAB中也有类似的工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接