Ранг по двум столбцам, r - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь создать столбец, который будет ранжировать 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, оценки Джо от 1: 4 , et c.

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

Есть ли у кого-нибудь предложения?

С уважением

Кевин

Ответы [ 4 ]

2 голосов
/ 16 июня 2020

Вы можете упорядочить данные и присвоить номер строки для каждой name.

Это можно сделать в базе 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())
2 голосов
/ 16 июня 2020

Вы можете использовать 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
2 голосов
/ 16 июня 2020

Вот решение 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

1 голос
/ 16 июня 2020

Использование 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 вы можете обрабатывать t ie рангов. Выбор ties.method="first" эквивалентен

learnrank %>%
  group_by(names) %>%
  mutate(rank=row_number(x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...