如何为此数据集添加排名列?

问题描述

我的数据如下:

 df <- data.frame(
  comp_name = c("A","B","C","D","E","F","G","H","J","K","L","M"),country = c("US","UK","France","Germany","US","Germany"),profit = c(100,125,150,165,110,130,250,95,100)
)

df:

   comp_name country profit
1          A      US    100
2          B      UK    125
3          C  France    150
4          D Germany    165
5          E      US    150
6          F      UK    110
7          G  France    110
8          H Germany    125
9          J      US    130
10         K      UK    250
11         L  France     95
12         M Germany    100

我想在这个数据框中添加一个排名列,按国家/地区的利润对公司进行排名,如下所示:

   comp_name country profit rank
1          A      US    100    3
2          B      UK    125    2
3          C  France    150    1
4          D Germany    165    1
5          E      US    150    1
6          F      UK    110    3
7          G  France    110    2
8          H Germany    125    2
9          J      US    130    2
10         K      UK    250    1
11         L  France     95    3
12         M Germany    100    3

我对 R 比较陌生,不知道从哪里开始。任何帮助将不胜感激。谢谢!

解决方法

这行得通吗:

library(dplyr)
df %>% group_by(country) %>% mutate(rank = rank(desc(profit)))
# A tibble: 12 x 4
# Groups:   country [4]
   comp_name country profit  rank
   <chr>     <chr>    <dbl> <dbl>
 1 A         US         100     3
 2 B         UK         125     2
 3 C         France     150     1
 4 D         Germany    165     1
 5 E         US         150     1
 6 F         UK         110     3
 7 G         France     110     2
 8 H         Germany    125     2
 9 J         US         130     2
10 K         UK         250     1
11 L         France      95     3
12 M         Germany    100     3
,

带有 data.table 的选项

library(data.table)
setDT(df)[,Rank := frank(-profit),country]
,

使用 rank + ave 的基本 R 选项

transform(
  df,Rank = ave(-profit,country,FUN = rank)
)

给予

   comp_name country profit Rank
1          A      US    100    3
2          B      UK    125    2
3          C  France    150    1
4          D Germany    165    1
5          E      US    150    1
6          F      UK    110    3
7          G  France    110    2
8          H Germany    125    2
9          J      US    130    2
10         K      UK    250    1
11         L  France     95    3
12         M Germany    100    3
,
df %>% 
  dplyr::group_by(country) %>% 
  dplyr::group_map(function(x,y){
    x %>% dplyr::mutate(rank = rank(-profit))
  }) %>% 
  dplyr::bind_rows()

Karthik S 提供了一个更清晰的答案。 显然,这里的 group_map 是多余的

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...