Ранжирование нескольких столбцов в R

cУ меня есть следующий фрейм данных:

 teamID X3M   TR   AS  ST  BK  PTS       FGP       FTP
   1    423 2884 1405 585 344 5797 0.4763141 0.7370821
   2    467 2509  868 326 200 6159 0.4590164 0.7604167
   3    769 1944 1446 614 168 6801 0.4248021 0.7825521
   4    814 2457 1596 620 308 8058 0.4348856 0.8241445
   5    356 2215 1153 403 243 4801 0.4427576 0.7478921
   6    302 3360 1151 381 393 6271 0.4626974 0.6757176
   7    384 2318 1070 431 269 5225 0.4345146 0.7460317
   8    353 2529 1683 561 203 6150 0.4537273 0.7344740
   9    598 2384 1635 497 162 6439 0.4512104 0.7998392
  10    502 3191 1898 525 337 7107 0.4598565 0.7836970

Я хочу создать фрейм данных следующим образом:

 teamID rank_X3M rank_TR rank_AS rank_ST rank_BK rank_PTS rank_FGP rank_FTP
   1    5
   2    6
   3    9
   4    10
   5    3
   6    1
   7    4
   8    2
   9    8
  10    7

Я попробовал применить(-df[,c(2:9)], 1, rank, ties.method='min') и получил это

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
X3M    4    4    5    4    4    6    4    4    5     6
TR     2    2    2    2    2    2    2    2    2     2
AS     3    3    3    3    3    3    3    3    3     3
ST     5    5    4    5    5    4    5    5    4     5
BK     6    6    6    6    6    5    6    6    6     4
PTS    1    1    1    1    1    1    1    1    1     1
FGP    8    8    8    8    8    8    8    8    8     8
FTP    7    7    7    7    7    7    7    7    7     7

Любые предложения о том, что попробовать дальше? Спасибо!


person Eric Truett    schedule 12.03.2015    source источник
comment
Вам нужен ранг по строкам? Может быть, вам нужно t(output). Пожалуйста, опубликуйте ожидаемый результат   -  person akrun    schedule 12.03.2015
comment
Попробуйте df[-1] <- lapply(df[-1], rank, ties.method = 'min')   -  person David Arenburg    schedule 12.03.2015
comment
Кроме того, убедитесь, что ваши данные не представлены факторами. (например, lapply(df,class) ), поскольку факторы ранжируются по их кодированию, а не по значениям, которые они представляют.   -  person Jthorpe    schedule 12.03.2015
comment
Ранг основан на значении строки. Используя столбец X3M, ранги должны быть следующими: команда 4 — 10, команда 3 — 9 и так далее.   -  person Eric Truett    schedule 12.03.2015
comment
Я попробовал предложение Дэвида, но элементы списка - это категории. ($X3M [1] 4 8 9 3 5 7 2 1 6 10). Мне нужен ранг каждой команды в каждой категории.   -  person Eric Truett    schedule 12.03.2015
comment
Можете ли вы показать, как будет выглядеть желаемый результат?   -  person David Arenburg    schedule 12.03.2015
comment
Дэвид - см. отредактированную версию выше   -  person Eric Truett    schedule 12.03.2015
comment
Мой код дает именно такой результат... Я также не вижу ваших комментариев, если вы не звоните мне, используя @ перед моим именем.   -  person David Arenburg    schedule 12.03.2015
comment
@DavidArenburg Я попробовал правую часть предоставленного вами оператора lapply, не назначая его df[-1]. Ваш код работает.   -  person Eric Truett    schedule 13.03.2015


Ответы (1)


Попробуйте sapply, как показано ниже, вы можете изменить имена переменных позже.

cl <- read.table(text="
           teamID X3M   TR   AS  ST  BK  PTS       FGP       FTP
1    423 2884 1405 585 344 5797 0.4763141 0.7370821
2    467 2509  868 326 200 6159 0.4590164 0.7604167
3    769 1944 1446 614 168 6801 0.4248021 0.7825521
4    814 2457 1596 620 308 8058 0.4348856 0.8241445
5    356 2215 1153 403 243 4801 0.4427576 0.7478921
6    302 3360 1151 381 393 6271 0.4626974 0.6757176
7    384 2318 1070 431 269 5225 0.4345146 0.7460317
8    353 2529 1683 561 203 6150 0.4537273 0.7344740
9    598 2384 1635 497 162 6439 0.4512104 0.7998392
10    502 3191 1898 525 337 7107 0.4598565 0.7836970", header=T)

new <- cbind(cl$teamID, sapply(cl[,c(2:9)], rank))

new
             X3M TR AS ST BK PTS FGP FTP
     [1,]  1   5  8  5  8  9   3  10   3
     [2,]  2   6  6  1  1  3   5   7   6
     [3,]  3   9  1  6  9  2   8   1   7
     [4,]  4  10  5  7 10  7  10   3  10
     [5,]  5   3  2  4  3  5   1   4   5
     [6,]  6   1 10  3  2 10   6   9   1
     [7,]  7   4  3  2  4  6   2   2   4
     [8,]  8   2  7  9  7  4   4   6   2
     [9,]  9   8  4  8  5  1   7   5   9
    [10,] 10   7  9 10  6  8   9   8   8
person nathanlim45    schedule 12.03.2015