2011-04-09 89 views
1

我有以下数据帧R按()data.frame

head(stockdatareturnpercent) 
        SPY   DIA  IWM  SMH  OIH   
2001-04-02 8.1985485 7.8349806 7.935566 21.223832 13.975655 
2001-05-01 -0.5621328 1.7198760 2.141846 -10.904936 -4.565291 
2001-06-01 -2.6957979 -3.5838102 2.786250 4.671762 -23.241009 
2001-07-02 -1.0248091 -0.1997433 -5.725078 -3.354391 -9.161594 
2001-08-01 -6.1165559 -5.0276558 -2.461728 -6.218129 -13.956695 
2001-09-04 -8.8900629 -12.2663267 -15.760037 -39.321172 -16.902913 

实际上有更多的股,但出于说明的目的,我不得不剪下来。在每个月中,我想知道从最好到最差(或从最差到最好)的表演者。我玩弄了sort()函数,这就是我想出的。

N <- dim(stockdatareturnpercent)[1] 
for (i in 1:N) { 
    s <- sort(stockdatareturnpercent[i,]) 
    print(s) 
} 

       UPS  FDX  XLP  XLU  XLV  DIA  IWM  SPY  XLE  XLB  XLI  OIH  XLK  SMH  MSFT 
2001-04-02 0.6481585 0.93135 1.923136 4.712996 7.122751 7.83498 7.935566 8.198549 9.826701 10.13465 10.82522 13.97566 14.98789 21.22383 21.41436 
       SMH  FDX  OIH  XLK  XLE  SPY  XLU  XLP  DIA  MSFT  IWM  UPS  XLV  XLB  XLI 
2001-05-01 -10.90494 -5.045544 -4.565291 -4.182041 -0.9492803 -0.5621328 0.6987724 1.457579 1.719876 2.088734 2.141846 3.73587 3.748309 3.774033 4.099748 
       OIH  XLE  XLI  XLU  XLP  XLB  DIA  UPS  SPY  XLV  FDX  XLK  IWM  SMH  MSFT 
2001-06-01 -23.24101 -10.02403 -6.594324 -5.8602 -5.0532 -3.955192 -3.58381 -2.814685 -2.695798 -1.177474 0.4987542 1.935544 2.78625 4.671762 5.374764 
       MSFT  OIH  XLK  IWM  SMH  XLV  UPS  XLE  SPY  XLU  XLB  XLI  DIA  FDX 
2001-07-02 -9.793005 -9.161594 -7.17351 -5.725078 -3.354391 -2.016818 -1.692442 -1.159914 -1.024809 -0.9029407 -0.2723560 -0.2078283 -0.1997433 2.868898 
       XLP 
2001-07-02 2.998604 

这是一种非常低效且便宜的方法来查看结果。最好创建一个存储这些数据的对象。但是,如果我在R提示符中键入's',那么我只会得到最后一行的值,因为for循环的每个后续迭代都会替换以前的数据。

我将不胜感激一些指导。非常感谢你。

+3

's'只包含最后一行,因为每次迭代都要重新分配(覆盖)它。 – 2011-04-09 03:11:45

回答

0

使用原密码保存每个排序行中的list

stockdatareturnpercent <- read.table(textConnection("     SPY   DIA  IWM  SMH  OIH   
2001-04-02 8.1985485 7.8349806 7.935566 21.223832 13.975655 
2001-05-01 -0.5621328 1.7198760 2.141846 -10.904936 -4.565291 
2001-06-01 -2.6957979 -3.5838102 2.786250 4.671762 -23.241009 
2001-07-02 -1.0248091 -0.1997433 -5.725078 -3.354391 -9.161594 
2001-08-01 -6.1165559 -5.0276558 -2.461728 -6.218129 -13.956695 
2001-09-04 -8.8900629 -12.2663267 -15.760037 -39.321172 -16.902913")) 

x <- vector("list", nrow(stockdatareturnpercent)) 

## use unlist to drop the data.frame structure 
for (i in 1:nrow(stockdatareturnpercent)) { 
    x[[i]] <- sort(unlist(stockdatareturnpercent[i,]) ) 
} 
## use the row names to name each list element 
names(x) <- rownames(stockdatareturnpercent) 

x 
$`2001-04-02` 
    DIA  IWM  SPY  OIH  SMH 
7.834981 7.935566 8.198548 13.975655 21.223832 

$`2001-05-01` 
    SMH   OIH   SPY   DIA   IWM 
-10.9049360 -4.5652910 -0.5621328 1.7198760 2.1418460 

$`2001-06-01` 
    OIH  DIA  SPY  IWM  SMH 
-23.241009 -3.583810 -2.695798 2.786250 4.671762 

$`2001-07-02` 
    OIH  IWM  SMH  SPY  DIA 
-9.1615940 -5.7250780 -3.3543910 -1.0248091 -0.1997433 

$`2001-08-01` 
    OIH  SMH  SPY  DIA  IWM 
-13.956695 -6.218129 -6.116556 -5.027656 -2.461728 

$`2001-09-04` 
    SMH  OIH  IWM  DIA  SPY 
-39.321172 -16.902913 -15.760037 -12.266327 -8.890063 

对于直接使用apply排序每一行,但不保留元素名称:

apply(stockdatareturnpercent, 1, sort) 

返回一个矩阵,其中每列是排序的行。然后转:

sortmat <- t(apply(stockdatareturnpercent, 1, sort)) 

如果你需要的结果作为data.frame,as.data.frame它:

sortdf <- as.data.frame(sortmat) 

最后,所有在一行

sortdf <- as.data.frame(t(apply(stockdatareturnpercent, 1, sort))) 
+0

谢谢。似乎虽然列已排序,但现在无法确定这些退货属于哪个库存。例如,新数据框中的第一列表示表现最差的值,但没有办法将该返回与股票相关联。原始data.frame的列名称设置为股票代码,所以我的方法很愚蠢,因为它使我能够看到每个月的执行顺序。我非常感谢你的解决方案为我提供了额外的知识和工具。我会补充一些。已更新 – codingknob 2011-04-09 04:30:48

+0

以将每个已排序的行保留为列表中的已命名向量 – mdsumner 2011-04-09 23:48:30

2

使用order()为此,如sort()使用时删除名称*apply

id <- t(apply(Data,1,order)) 
lapply(1:nrow(id),function(i)Data[i,id[i,]]) 

在ID矩阵使用的order结果也允许你做如:

matrix(names(Data)[id],ncol=ncol(Data)) 
    [,1] [,2] [,3] [,4] [,5] 
[1,] "DIA" "IWM" "SPY" "OIH" "SMH" 
[2,] "SMH" "OIH" "SPY" "DIA" "IWM" 
[3,] "OIH" "DIA" "SPY" "IWM" "SMH" 
[4,] "OIH" "IWM" "SMH" "SPY" "DIA" 
[5,] "OIH" "SMH" "SPY" "DIA" "IWM" 
[6,] "SMH" "OIH" "IWM" "DIA" "SPY" 

要找出那些至极了在给定时刻最好的。

如果你想使用你的循环,你可以使用列表。正如约书亚所说,你在每个循环中都会覆盖s。初始化列表以首先存储结果。该循环给出了与上述代码lapply()相同的结果,但没有id矩阵。有没有在速度上没有收获,虽然使用应用还有其他好处:

N <- nrow(Data) 
s <- vector("list",N) 
for (i in 1:N) { 
    s[[i]] <- sort(Data[i,]) 
} 

我测试使用下面的示例数据的代码(请提供你自己的未来,无论是使用这个例子或如dput()):

zz <- textConnection(" SPY   DIA  IWM  SMH  OIH 
    8.1985485 7.8349806 7.935566 21.223832 13.975655 
-0.5621328 1.7198760 2.141846 -10.904936 -4.565291 
-2.6957979 -3.5838102 2.786250 4.671762 -23.241009 
-1.0248091 -0.1997433 -5.725078 -3.354391 -9.161594 
-6.1165559 -5.0276558 -2.461728 -6.218129 -13.956695 
-8.8900629 -12.2663267 -15.760037 -39.321172 -16.902913 ") 

Data <- read.table(zz,header=T) 
close(zz)