У меня есть фрейм данных, ниже приведены образцы данных из него.
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
Есть ли какая-нибудь функция, позволяющая легко выполнить такое требование?