我有一个数据框,以下是其中的样本数据:
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列进行排序的。
现在,我的要求是添加一个名为Ranking的新列,并对每组CATEGORY从1开始进行排名。每当列表中出现新的CATEGORY时,排名编号应该从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
更进一步的要求
假设输入数据集完全是Zigzag形状。那么
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"
注意:在格式化输入数据集以准备消除缺失值的过程中,有一些类别被完全删除了。
注意:返回的数据框应该将行名称作为类别。
在对数据框进行排名之后,我想编写一个函数,其中我将Ranking作为参数传递给函数。该函数应返回每个CATEGORY中具有该特定排名的公司的数据框。如果在任何类别中没有具有这种特定排名的公司,则返回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
有没有函数可以轻松地满足这种要求?
df$Ranking <- ave(as.character(df$Category), df$Category, FUN = seq_along)
的代码也可以工作。 - A5C1D2H2I1M1N2O1R2T1