2

我正在尝试对订单股票进行排名(例如通过回报)。因此,我希望收到一个表格,其中包含按升序/降序排列的股票名称(此排名函数的参数),并正确处理 NA(在每行末尾移动)。我真的想不出一个优雅的方式来做到这一点。

下面是我想要的一个例子:

这是 xts 对象的核心数据,表示不同时间的某些属性:

           john    joe     tina    jack    suzie   sasha   sven    luca   
2003-05-29 1       2       3       4       5       6       7       8  
2003-06-27 2       3       4       5       6       7       8       1  
2003-07-30 3       4       5       6       7       8       1       2
2003-07-31 NA      2       3       4       5       6       1       NA

我需要一个数据框,它在每一行(对于每个日期)显示来自前一个数据框的列名,该数据框在第 1 列中排名最高(基于属性),在第 2 列中排名第二,...请注意,对于最后一行我需要将 NA 移到末尾(最后两列)或跳过的案例...

           [,1]    [,2]    [,3]    [,4]    [,5]    [,6]    [,7]    [,8]   
2003-05-29 "john"  "joe"   "tina"  "jack"  "suzie" "sasha" "sven"  "luca"  
2003-06-27 "luca"  "john"  "joe"   "tina"  "jack"  "suzie" "sasha" "sven"
2003-07-30 "sven"  "luca"  "john"  "joe"   "tina"  "jack"  "suzie" "sasha"
2003-07-31 "sven"  "joe"   "tina"  "jack"  "suzie" "sasha" "john"  "luca" 

在此先感谢您的帮助。作为 R 的初学者,这对我来说是个难题……

亲切的问候,
萨摩。

4

1 回答 1

1

假设m是您的原始矩阵(即 xts 的核心数据)。然后你可以得到你想要的:

> nams <- colnames(m)
> t( apply(m, 1, function(r) nams[ order(r) ] ) )
           [,1]   [,2]   [,3]   [,4]   [,5]    [,6]    [,7]    [,8]   
2003-05-29 "john" "joe"  "tina" "jack" "suzie" "sasha" "sven"  "luca" 
2003-06-27 "luca" "john" "joe"  "tina" "jack"  "suzie" "sasha" "sven" 
2003-07-30 "sven" "luca" "john" "joe"  "tina"  "jack"  "suzie" "sasha"
2003-07-31 "sven" "joe"  "tina" "jack" "suzie" "sasha" "john"  "luca" 

请注意,order(r)将向量转换为向量rp使得序列 r[p[1]], r[ p[2] ], r[ p[3] ], ...处于非递减顺序,并且默认是将 NA 推到末尾。

于 2011-02-21T21:01:33.037 回答