在两列上排名,r
Rank on two columns, r
我正在尝试创建一个按名称分组对 x 进行排名的列。
names <- rep(c("Ben", "Joe", "Karen", "Joan"), times = 4)
set.seed(1)
x <- sample((1:10), 16, replace = TRUE)
learnrank <- data.frame(names,x)
我用的是tapply函数:
learnrank$rank <-
tapply(learnrank$x, learnrank$names,
rank, ties.method = "first")
learnrank
names x rank
<chr> <int> <list>
Ben 3 <int [4]>
Joe 4 <int [4]>
Karen 6 <int [4]>
Joan 10 <int [4]>
Ben 3 <int [4]>
Joe 9 <int [4]>
Karen 10 <int [4]>
Joan 7 <int [4]>
Ben 7 <int [4]>
Joe 1 <int [4]>
我想要的是下面这个,我们在其中对 1:4 的所有 Ben 分数、1:4 的 Joe 的分数等进行排名
names x rank
<chr> <int> <list>
Ben 3 1
Joe 4 2
Karen 6 2
Joan 10 4
Ben 3 2
Joe 9 4
Karen 10 4
Joan 7 3
Ben 7 3
Joe 1 1
有人有什么建议吗?
此致
凯文
这是一个 dplyr 解决方案:
library(dplyr)
learnrank %>%
group_by(names) %>%
mutate(x = sort(x), rank = order(-x)) %>%
arrange(names)
#> # A tibble: 16 x 3
#> # Groups: names [4]
#> names x rank
#> <fct> <int> <int>
#> 1 Ben 1 4
#> 2 Ben 2 3
#> 3 Ben 6 2
#> 4 Ben 9 1
#> 5 Joan 1 4
#> 6 Joan 3 3
#> 7 Joan 9 2
#> 8 Joan 10 1
#> 9 Joe 4 4
#> 10 Joe 5 3
#> 11 Joe 7 2
#> 12 Joe 10 1
#> 13 Karen 2 3
#> 14 Karen 5 4
#> 15 Karen 7 2
#> 16 Karen 7 1
您可以使用 ave
而不是 tapply
,例如:
learnrank$rank <- ave(learnrank$x, learnrank$names,
FUN=function(x) rank(x, ties.method = "first"))
learnrank
# names x rank
#1 Ben 9 4
#2 Joe 4 1
#3 Karen 7 3
#4 Joan 1 1
#5 Ben 2 2
#6 Joe 7 3
#7 Karen 2 1
#8 Joan 3 2
#9 Ben 1 1
#10 Joe 5 2
#11 Karen 5 2
#12 Joan 10 4
#13 Ben 6 3
#14 Joe 10 4
#15 Karen 7 4
#16 Joan 9 3
使用dplyr
:
learnrank %>%
group_by(names) %>%
mutate(rank=rank(x))
给你
# A tibble: 16 x 3
# Groups: names [4]
names x rank
<fct> <int> <dbl>
1 Ben 9 4
2 Joe 4 1
3 Karen 7 3.5
4 Joan 1 1
5 Ben 2 2
6 Joe 7 3
7 Karen 2 1
8 Joan 3 2
9 Ben 1 1
10 Joe 5 2
11 Karen 5 2
12 Joan 10 4
13 Ben 6 3
14 Joe 10 4
15 Karen 7 3.5
16 Joan 9 3
使用参数 ties.method
,您可以处理等级平局。选择ties.method="first"
相当于
learnrank %>%
group_by(names) %>%
mutate(rank=row_number(x))
您可以对数据进行排序并为每个 name
分配行号。
这可以在 base R 中完成:
learnrank <- learnrank[do.call(order, learnrank), ]
learnrank$rank <- with(learnrank, ave(x, names, FUN = seq_along))
或使用dplyr
:
library(dplyr)
learnrank %>%
arrange_all() %>%
group_by(names) %>%
mutate(row = row_number())
我正在尝试创建一个按名称分组对 x 进行排名的列。
names <- rep(c("Ben", "Joe", "Karen", "Joan"), times = 4)
set.seed(1)
x <- sample((1:10), 16, replace = TRUE)
learnrank <- data.frame(names,x)
我用的是tapply函数:
learnrank$rank <-
tapply(learnrank$x, learnrank$names,
rank, ties.method = "first")
learnrank
names x rank
<chr> <int> <list>
Ben 3 <int [4]>
Joe 4 <int [4]>
Karen 6 <int [4]>
Joan 10 <int [4]>
Ben 3 <int [4]>
Joe 9 <int [4]>
Karen 10 <int [4]>
Joan 7 <int [4]>
Ben 7 <int [4]>
Joe 1 <int [4]>
我想要的是下面这个,我们在其中对 1:4 的所有 Ben 分数、1:4 的 Joe 的分数等进行排名
names x rank
<chr> <int> <list>
Ben 3 1
Joe 4 2
Karen 6 2
Joan 10 4
Ben 3 2
Joe 9 4
Karen 10 4
Joan 7 3
Ben 7 3
Joe 1 1
有人有什么建议吗?
此致
凯文
这是一个 dplyr 解决方案:
library(dplyr)
learnrank %>%
group_by(names) %>%
mutate(x = sort(x), rank = order(-x)) %>%
arrange(names)
#> # A tibble: 16 x 3
#> # Groups: names [4]
#> names x rank
#> <fct> <int> <int>
#> 1 Ben 1 4
#> 2 Ben 2 3
#> 3 Ben 6 2
#> 4 Ben 9 1
#> 5 Joan 1 4
#> 6 Joan 3 3
#> 7 Joan 9 2
#> 8 Joan 10 1
#> 9 Joe 4 4
#> 10 Joe 5 3
#> 11 Joe 7 2
#> 12 Joe 10 1
#> 13 Karen 2 3
#> 14 Karen 5 4
#> 15 Karen 7 2
#> 16 Karen 7 1
您可以使用 ave
而不是 tapply
,例如:
learnrank$rank <- ave(learnrank$x, learnrank$names,
FUN=function(x) rank(x, ties.method = "first"))
learnrank
# names x rank
#1 Ben 9 4
#2 Joe 4 1
#3 Karen 7 3
#4 Joan 1 1
#5 Ben 2 2
#6 Joe 7 3
#7 Karen 2 1
#8 Joan 3 2
#9 Ben 1 1
#10 Joe 5 2
#11 Karen 5 2
#12 Joan 10 4
#13 Ben 6 3
#14 Joe 10 4
#15 Karen 7 4
#16 Joan 9 3
使用dplyr
:
learnrank %>%
group_by(names) %>%
mutate(rank=rank(x))
给你
# A tibble: 16 x 3
# Groups: names [4]
names x rank
<fct> <int> <dbl>
1 Ben 9 4
2 Joe 4 1
3 Karen 7 3.5
4 Joan 1 1
5 Ben 2 2
6 Joe 7 3
7 Karen 2 1
8 Joan 3 2
9 Ben 1 1
10 Joe 5 2
11 Karen 5 2
12 Joan 10 4
13 Ben 6 3
14 Joe 10 4
15 Karen 7 3.5
16 Joan 9 3
使用参数 ties.method
,您可以处理等级平局。选择ties.method="first"
相当于
learnrank %>%
group_by(names) %>%
mutate(rank=row_number(x))
您可以对数据进行排序并为每个 name
分配行号。
这可以在 base R 中完成:
learnrank <- learnrank[do.call(order, learnrank), ]
learnrank$rank <- with(learnrank, ave(x, names, FUN = seq_along))
或使用dplyr
:
library(dplyr)
learnrank %>%
arrange_all() %>%
group_by(names) %>%
mutate(row = row_number())