对R中的数据框列进行排名

时间:2013-10-16 12:18:53

标签: r dataframe ranking

我有数据框,下面是来自它的样本数据。

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

进一步要求

假设完全锯齿形的输入数据集。然后

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"

注意:在格式化输入数据集以使其免于缺失值的过程中,已完成删除了几个类别。

注意:返回的数据框应将行名称作为类别

在对数据框进行排名后,我想编写一个函数,其中我将排名作为参数传递给函数。 该函数应返回每个CATEGORY中具有该特定排名的公司的数据框。如果在任何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

是否有任何功能可以轻松获得此类要求?

1 个答案:

答案 0 :(得分:10)

假设您的数据框名为df,请尝试以下操作:

df$Ranking <- ave( df$Margin, df$Category, FUN=rank )