如何使用条件对列进行排名

时间:2018-09-27 21:00:32

标签: r rank

我有一个数据框:

dt <- read.table(text = "
1 390 
1 366
1 276 
1 112 
2 97
2 198  
2 400  
2 402
3 110
3 625
4 137
4 49
4 9
4 578 ")

第一个列是索引,第二个列是距离。

我想添加一个列以按索引将距离降序排列(最高距离将排在第一位)

结果将是:

dt <- read.table(text = "
1 390 1
1 66  4
1 276 2
1 112 3
2 97  4
2 198 3 
2 300 2
2 402 1
3 110 2
3 625 1
4 137 2
4 49  3
4 9   4
4 578 1")

3 个答案:

答案 0 :(得分:2)

另一种基于R的方法

> dt$Rank <- unlist(tapply(-dt$V2, dt$V1, rank))

tidyverse解决方案

dt %>% 
  group_by(V1) %>% 
  mutate(Rank=rank(-V2))

答案 1 :(得分:1)

transform(dt,s = ave(-V2,V1,FUN = rank))
   V1  V2 s
1   1 390 1
2   1  66 4
3   1 276 2
4   1 112 3
5   2  97 4
6   2 198 3
7   2 300 2
8   2 402 1
9   3 110 2
10  3 625 1
11  4 137 2
12  4  49 3
13  4   9 4
14  4 578 1

答案 2 :(得分:0)

您可以grouparrangerownumber。我认为,与简单的rank相比,结果在眼睛上要容易一些,因此值得采取额外的步骤。

dt %>% 
  group_by(V1) %>% 
  arrange(V1,desc(V2)) %>% 
  mutate(rank = row_number())

# A tibble: 14 x 3
# Groups:   V1 [4]
      V1    V2  rank
   <int> <int> <int>
 1     1   390     1
 2     1   366     2
 3     1   276     3
 4     1   112     4
 5     2   402     1
 6     2   400     2
 7     2   198     3
 8     2    97     4
 9     3   625     1
10     3   110     2
11     4   578     1
12     4   137     2
13     4    49     3
14     4     9     4

一个混乱的选择是min_rank

dt %>% 
  group_by(V1) %>% 
  mutate(min_rank(desc(V2)) )