如何对具有条件的列进行排名

How to rank a column with a condition

我有一个数据框:

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")
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

另一种基于 R 的方法

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

一个 tidyverse 解决方案

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

您可以 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)) )