Ранжирование столбцов фрейма данных в R

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

Company     Category    Margin
SBI             BK      34.5
PNB             BK      39.5
UCO BANK        BK      39.9
BANK            BK      41.3
INDIAN BANK     BK      42.3
DENA BANK       BK      44.5
VIJAYA BANK     BK      44.5
UNION BANK      BK      47.6
CENTRAL BANK    BK      49.8
INFOSYS         IT      5.6
HCL TECH        IT      5.9
TCS             IT      6.9
CMC             IT      12.6
TECHMAHINDRA    IT      12.6
COGNIZANT       IT      15.8
IGATE           IT      22.4
WIPRO           IT      22.9
HEXAWARE        IT      34.8
MAHINDRA SATYAM IT      34.8
DR. REDDYS      PH      14.5
SUN PHARMA      PH      19.2
CIPLA           PH      23.9
LUPIN           PH      23.9
DIVIS LABS      PH      29

Внимательный взгляд на фрейм данных показывает, что он отсортирован по столбцам CATEGORY, MARGIN и затем COMPANY.

Теперь мое требование - добавить новый столбец под названием «Рейтинг» и дать рейтинг, начиная с 1, для каждого набора КАТЕГОРИИ. Нумерация рейтинга должна начинаться с 1 всякий раз, когда в списке появляется новая КАТЕГОРИЯ.

Пример вывода:

Company     Category    Margin     Ranking
SBI             BK      34.5       1
PNB             BK      39.5       2
UCO BANK        BK      39.9       3 
BANK            BK      41.3       4
INDIAN BANK     BK      42.3       5
DENA BANK       BK      44.5       6
VIJAYA BANK     BK      44.5       7
UNION BANK      BK      47.6       8
CENTRAL BANK    BK      49.8       9
INFOSYS         IT      5.6        1
HCL TECH        IT      5.9        2
TCS             IT      6.9        3
CMC             IT      12.6       4
TECHMAHINDRA    IT      12.6       5
COGNIZANT       IT      15.8       6
IGATE           IT      22.4       7
WIPRO           IT      22.9       8
HEXAWARE        IT      34.8       9
MAHINDRA SATYAM IT      34.8       10
DR. REDDYS      PH      14.5       1
SUN PHARMA      PH      19.2       2
CIPLA           PH      23.9       3
LUPIN           PH      23.9       4
DIVIS LABS      PH      29         5

Дополнительные требования

Предположим, что входной набор данных полностью зигзагообразен. потом

unique(df$Category)   # gives 5 different category
[1] "BK" "IT" "PH" "MT" "EG"

После форматирования возвращается такой же

unique(df$Category)   # gives only 3 categories. rest of 2 categories were deleted.
[1] "BK" "IT" "PH"

Примечание. В процессе форматирования входного набора данных, чтобы подготовить его без пропущенных значений, несколько категорий были полностью удалены.

Примечание. В возвращаемом фрейме данных должны быть имена строк в виде категорий.

После ранжирования фрейма данных я хотел бы написать функцию, в которой я передам ранжирование в качестве параметра функции. Функция должна возвращать фрейм данных с Компанией в каждой КАТЕГОРИИ с этим конкретным рейтингом. В случае, если в какой-либо КАТЕГОРИИ нет КОМПАНИИ с таким РЕЙТИНГОМ, то будет возвращено NA.

head(companyRanks(3), 4) returns
    COMPANY     CATEGORY
BK  UCO BANK        BK      
IT  TCS             IT      
PH  CIPLA           PH      
MT  <NA>            MT
EG  <NA>            EG

head(companyRanks(10), 4)  # returns:
            COMPANY     CATEGORY
BK             <NA>           BK  # Since there is no company with rank 10 under category BK, NA returned
IT  MAHINDRA SATYAM           IT      
PH             <NA>           PH      
MT             <NA>           MT
EG             <NA>           EG

Есть ли какая-нибудь функция, позволяющая легко выполнить такое требование?


person Kumar    schedule 16.10.2013    source источник


Ответы (1)


Предположим, ваш фрейм данных называется df, попробуйте следующее:

df$Ranking <- ave( df$Margin, df$Category, FUN=rank )
person Sophia    schedule 16.10.2013
comment
+1, но я даже не думаю, что требуется ранг, поскольку данные уже отсортированы, и им, похоже, наплевать на связи. Что-то вроде df$Ranking <- ave(as.character(df$Category), df$Category, FUN = seq_along) тоже должно работать. - person A5C1D2H2I1M1N2O1R2T1; 16.10.2013
comment
Привет, София / Ананда Махо! Не могли бы вы взглянуть на дополнительные требования, добавленные в вопросе? - person Kumar; 16.10.2013
comment
Извините, я не понимаю ваш вопрос после того, как вы добавили эти новые требования. - person Sophia; 16.10.2013