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

4

我有一个数据框,以下是其中的样本数据:

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

有没有函数可以轻松地满足这种要求?
1个回答

10

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

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

1
+1,但我甚至认为“排名”也不是必需的,因为数据已经排序,而且他们似乎并不关心并列。类似 df$Ranking <- ave(as.character(df$Category), df$Category, FUN = seq_along) 的代码也可以工作。 - A5C1D2H2I1M1N2O1R2T1
嗨Sophia / Ananda Maho,你能否请看一下问题中添加的额外要求? - Kumar
抱歉,在您添加了这些新要求后,我不理解您的问题。 - Sophia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接