如何对具有条件的列进行排名
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))
您可以 group
、arrange
和 rownumber
。我认为,结果比简单的 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)) )
我有一个数据框:
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))
您可以 group
、arrange
和 rownumber
。我认为,结果比简单的 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)) )