我是R语言的新手,正在尝试使用R语言中的两列数据对数据框进行排名,但碰到了困难。
数据的形式如下:
A B
1 1
2 1
2 1
4 4
5 3
我希望结果以以下形式呈现:
A B Rank
1 1 1
2 1 2
2 1 2
4 4 5
5 3 4
B排名第一,如果B值相等,则使用A进行排名。我认为我的问题与如何在R中同时按两个列对行进行排名?非常相似。我尝试了其中的答案,但这对我没有起作用。
我是R语言的新手,正在尝试使用R语言中的两列数据对数据框进行排名,但碰到了困难。
数据的形式如下:
A B
1 1
2 1
2 1
4 4
5 3
A B Rank
1 1 1
2 1 2
2 1 2
4 4 5
5 3 4
B排名第一,如果B值相等,则使用A进行排名。我认为我的问题与如何在R中同时按两个列对行进行排名?非常相似。我尝试了其中的答案,但这对我没有起作用。
dt <- structure(list(A = c(1L, 2L, 2L, 4L, 5L), B = c(1L, 1L, 1L, 4L,
3L)), row.names = c(NA, -5L), class = c("data.frame"
))
data.table
library(data.table)
setDT(dt)
setorder(dt, B, A)
dt[, Rank := .GRP, by = .(A, B)][, Rank := rank(Rank, ties.method = "min")]
dt
A B Rank
1: 1 1 1
2: 2 1 2
3: 2 1 2
4: 5 3 4
5: 4 4 5
dyplr
library(dplyr)
dt %>%
arrange(B, A) %>%
group_by(B, A) %>%
mutate(Rank = cur_group_id()) %>%
ungroup() %>%
mutate(Rank = rank(Rank, ties.method = "min"))
# A tibble: 5 x 3
A B Rank
<int> <int> <int>
1 1 1 1
2 2 1 2
3 2 1 2
4 5 3 4
5 4 4 5
data.table::frank
或 dplyr::min_rank
:
data.table::frank
dt$Rank <- frank(dt, B, A, ties.method = "min")
dt
A B Rank
1 1 1 1
2 2 1 2
3 2 1 2
4 4 4 5
5 5 3 4
dplyr::min_rank
mutate(dt, Rank = min_rank(paste(B,A)))
A B Rank
1 1 1 1
2 2 1 2
3 2 1 2
4 4 4 5
5 5 3 4
数据
dt <- data.frame(A = c(1,2,2,4,5), B = c(1,1,1,4,3))
dt[, Rank := frank(.SD, ties.method = "min"), .SDcols = c("B", "A")]
。 - Merijn van Tilborgdplyr
解决方案中,如果 A
和 B
的某些值是两位数,那么 paste
函数是否能够正确工作? - bill999transform(
df,
Rank = rank(A[order(B, A)], ties.method = "min")
)
这提供了
A B Rank
1 1 1 1
2 2 1 2
3 2 1 2
4 4 4 5
5 5 3 4
arrange
的函数,首先按B,然后按A排序,创建列的顺序作为排名,然后重新排列以模拟您的输出。ifelse
语句,该语句查看前一行并保留排名(如果此行具有相同的A和B值)。df <- data.frame(A = c(1,2,2,4,5),
B = c(1,1,1,4,3))
library(tidyverse)
df %>%
arrange(B,A) %>%
mutate(Rank = 1:n(),
Rank = ifelse(A == lag(A, default = 0) & B == lag(B, default = 0),
lag(Rank), Rank)) %>%
arrange(A,B)
#> A B Rank
#> 1 1 1 1
#> 2 2 1 2
#> 3 2 1 2
#> 4 4 4 5
#> 5 5 3 4
由reprex package (v2.0.1)于2022年01月07日创建
A
以前有一个3(被2替换),列B
以前有一个2(被1替换)。 - KamRa