我有一个数据框:
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")
答案 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)
您可以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)) )