Ранжирование нескольких столбцов в кадре данных - PullRequest
0 голосов
/ 05 мая 2018

У меня есть дата-месяц ежемесячных возвратов акций (каждая строка - месяц):

df:
            Stock A Stock B Stock C ....
Jun 1927     1%    2%        3%
Jul 1927     3%    1%        2%
Aug 1927     2%    3%        1%
Sep 1927     5%    2%        9%
...
...

и я хотел бы ранжировать акции для каждого месяца на основе прибыли и создать новый фрейм данных на основе этого.

Так что-то вроде этого:

df_rank:
            Stock A Stock B Stock C
Jun 1927     1      2         3
Jul 1927     3      1         2
Aug 1927     2      3         1
Sep 1927     2      3         1

Я думал о чем-то вроде этого:

df_rank<-data.frame(matrix(NA, nrow = nrow(df), ncol = ncol(df)))
for (i in seq(1:nrow(df))){
   df1<-data.frame(rank(df[i,]))
   df_rank<-cbind(df_rank,df1)
}

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Если у нас есть ваши данные в качестве data.frame с некоторыми изменениями в процентах.

     month StockA StockB StockC
1 Jun 1927     1%     2%     3%
2 Jul 1927     3%     1%    -4%
3 Aug 1927   6.4%     3%     4%

мы можем использовать apply для запуска функции в строках. Чтобы вернуть его в правильную форму, нам нужно применить транспонирование.

t(apply(df[, -1], 1, rank))
     StockA StockB StockC
[1,]      1      2      3
[2,]      3      2      1
[3,]      3      1      2

# to replace the data in the data.frame
df[, -1] <- t(apply(df[, -1], 1, rank))
df
     month StockA StockB StockC
1 Jun 1927      1      2      3
2 Jul 1927      3      2      1
3 Aug 1927      3      1      2

Теперь я просто оценил проценты как значения символов. Вы также можете использовать функцию akrun и сначала удалить знак%, установить его в числовое значение, а затем в ранг.

t(apply(df[, -1], 1,  function(x) rank(as.numeric(sub("[%]", "", x)))))

В этом примере результат тот же. Но при многих процентах было бы лучше работать с реалами, а не с символами.

данные:

df <- structure(list(month = c("Jun 1927", "Jul 1927", "Aug 1927"), 
                     StockA = c("1%", "3%", "6.4%"), 
                     StockB = c("2%", "1%", "3%"), 
                     StockC = c("3%", "-4%", "4%")), 
                .Names = c("month", "StockA","StockB", "StockC"),
                class = "data.frame", row.names = c(NA, -3L))
0 голосов
/ 05 мая 2018

Мы могли бы удалить % и затем использовать rank:

df[] <- t(sapply(as.data.frame(t(df)), 
        function(x) rank(as.numeric(sub("[%]", "", x)))))
...