Сгруппировать по имени и ранжировать по внешнему виду и добавить количество, исключив имена, не связанные с топ-2 в каждом штате (по убыванию)?

#r #list #count #rank

#r #Список #количество #ранг

Вопрос:

Например, у меня есть набор данных, который выглядит следующим образом

     name |  state
   Smith      NY
 Anthony      CA
   James      MA
   Henry      CA
 Andrews      NY
   Helen      CA
   Smith      NY
   Smith      NY
 Anthony      CA
 Andrews      NY
 Richard      MA
 Richard      MA
 Richard      MA
 Anthony      CA
  Smith       MA
 Jeffries     CA
 Conrad       NY
  Hanes       NY
  James       MA
  Conrad      NY
  Conrad      NY
  Helen       CA
 

В конце концов, я бы хотел чего-то подобного. Обратите внимание, что состояния упорядочены в алфавитном порядке. Обратите внимание, что имена с наибольшим внешним видом отображаются вверху, а имя со следующим внешним видом следует за ним. Я выбираю только первые два в каждой группе (состоянии), затем создаю, чтобы эти столбцы ссылались на их ранг и количество на основе расположения строк.

   name|   state| Rank | Count 
Anthony     CA     1        3
Anthony     CA     1        3
Anthony     CA     1        3
 Helen      CA     2        2
 Helen      CA     2        2
Richard     MA     1        3
Richard     MA     1        3
Richard     MA     1        3
  James     MA     2        2
  James     MA     2        2
Smith       NY     1        3
Smith       NY     1        3
Smith       NY     1        3
Conrad      NY     1        3
Conrad      NY     1        3
Conrad      NY     1        3
 

Комментарии:

1. по количеству появлений для строки в состоянии. Энтони для Калифорнии равен 1, а Хелен равна 2, потому что Энтони отображается в необработанном наборе данных в трех строках.

Ответ №1:

Возможно, это помогает

 library(dplyr)
df1 %>%
   add_count(name, state) %>% 
   group_by(state) %>%
   mutate(Rank = dense_rank(-n)) %>% 
   arrange(state, Rank) %>% 
   filter(Rank %in% 1:2)
# A tibble: 18 x 4
# Groups:   state [3]
   name    state     n  Rank
   <chr>   <chr> <int> <int>
 1 Anthony CA        3     1
 2 Anthony CA        3     1
 3 Anthony CA        3     1
 4 Helen   CA        2     2
 5 Helen   CA        2     2
 6 Richard MA        3     1
 7 Richard MA        3     1
 8 Richard MA        3     1
 9 James   MA        2     2
10 James   MA        2     2
11 Smith   NY        3     1
12 Smith   NY        3     1
13 Smith   NY        3     1
14 Conrad  NY        3     1
15 Conrad  NY        3     1
16 Conrad  NY        3     1
17 Andrews NY        2     2
18 Andrews NY        2     2
 

данные

 df1 <- structure(list(name = c("Smith", "Anthony", "James", "Henry", 
"Andrews", "Helen", "Smith", "Smith", "Anthony", "Andrews", "Richard", 
"Richard", "Richard", "Anthony", "Smith", "Jeffries", "Conrad", 
"Hanes", "James", "Conrad", "Conrad", "Helen"), state = c("NY", 
"CA", "MA", "CA", "NY", "CA", "NY", "NY", "CA", "NY", "MA", "MA", 
"MA", "CA", "MA", "CA", "NY", "NY", "MA", "NY", "NY", "CA")),
class = "data.frame", row.names = c(NA, 
-22L))