Ранжирование наблюдений в группах, которые связаны - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь ранжировать определенные группы по их количеству, используя dense_rank, это не делает четкий ранг для групп, которые связаны. И любая функция ранжирования, которую я пробую, имеет своего рода ties.method, не дает мне ранжирование в последовательном порядке 1,2,3. Пример:

library(dplyr)
id <- c(rep(1, 8),
        rep(2, 8))

fruit <- c(rep('apple', 4), rep('orange', 1), rep('banana', 2), 'orange',
           rep('orange', 4), rep('banana', 1), rep('apple', 2), 'banana')

df <- data.frame(id, fruit, stringsAsFactors = FALSE)

df2 <- df %>% 
  mutate(counter = 1) %>% 
  group_by(id, fruit) %>% 
  mutate(fruitCnt = sum(counter)) %>% 
  ungroup() %>% 
  group_by(id) %>% 
  mutate(fruitCntRank = dense_rank(desc(fruitCnt))) %>% 
  select(id, fruit, fruitCntRank)
df2

      id fruit  fruitCntRank
 1     1 apple             1
 2     1 apple             1
 3     1 apple             1
 4     1 apple             1
 5     1 orange            2
 6     1 banana            2
 7     1 banana            2
 8     1 orange            2
 9     2 orange            1
10     2 orange            1
11     2 orange            1
12     2 orange            1
13     2 banana            2
14     2 apple             2
15     2 apple             2
16     2 banana            2

Неважно, какой из апельсинов или бананов занимает 3 место, и даже не обязательно быть последовательным. Мне просто нужно, чтобы группы были ранжированы 1, 2, 3.

Желаемый результат:

      id fruit  fruitCntRank
 1     1 apple             1
 2     1 apple             1
 3     1 apple             1
 4     1 apple             1
 5     1 orange            2
 6     1 banana            3
 7     1 banana            3
 8     1 orange            2
 9     2 orange            1
10     2 orange            1
11     2 orange            1
12     2 orange            1
13     2 banana            2
14     2 apple             3
15     2 apple             3
16     2 banana            2

1 Ответ

1 голос
/ 20 апреля 2020

Мы можем добавить количество для каждой комбинации id и fruit, arrange их в порядке убывания количества и получить ранг, используя match.

library(dplyr)

df %>%
  add_count(id, fruit) %>%
  arrange(id, desc(n)) %>%
  group_by(id) %>%
  mutate(n = match(fruit, unique(fruit)))
  #Another option with cumsum and duplicated
  #mutate(n = cumsum(!duplicated(fruit)))

#      id fruit      n
#   <dbl> <chr>  <int>
# 1     1 apple      1
# 2     1 apple      1
# 3     1 apple      1
# 4     1 apple      1
# 5     1 orange     2
# 6     1 banana     3
# 7     1 banana     3
# 8     1 orange     2
# 9     2 orange     1
#10     2 orange     1
#11     2 orange     1
#12     2 orange     1
#13     2 banana     2
#14     2 apple      3
#15     2 apple      3
#16     2 banana     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...