Ранжирование объектов xts, представляющих некоторое свойство акций, с использованием R

Я пытаюсь ранжировать акции по порядку (например, по доходности). В результате я хотел бы получить таблицу, содержащую названия акций в порядке возрастания/убывания (параметр этой функции ранжирования) с правильной обработкой 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, это создает для меня серьезную проблему...

С уважением,
Само.


person Samo    schedule 21.02.2011    source источник


Ответы (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) преобразует вектор r в вектор p таким образом, что последовательность r[p[1]], r[ p[2] ], r[ p[3] ], ... находится в неубывающем порядке, а по умолчанию NA помещаются в конец.

person Prasad Chalasani    schedule 21.02.2011
comment
Спасибо. Очень элегантный. Я использовал более 20 строк кода, чтобы сделать что-то похожее... Хорошо, как сделать так, чтобы это располагалось в каждой строке в порядке убывания с NA в конце? Дело в том, что вы никогда не знаете, сколько было NA, и вам понадобится способ узнать, какой из них лучший, второй, третий и т. Д. Thnx. Само. - person Samo; 22.02.2011
comment
Чтобы отсортировать в порядке убывания, замените order(r) выше на order(-r). - person Prasad Chalasani; 22.02.2011