Найти максимальное значение для конкретной группы с условием в R

#r

#r

Вопрос:

У меня есть такой набор данных:

 df1 <- structure(list(year = c(2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L),
       county = c("A", "A", "A", "B", "B", "B", "A", "A", "A", "B", "B", "B"), 
       party = c("P1", "P1", "P1", "P1", "P1", "P1","P1", "P1", "P1", "P1", "P1", "P1"),
       list_position = c("2", "3", "1", "3", "2", "1", "2", "3", "1", "3", "2", "1"),
       elected = c("1", "0", "1", "0", "0", "1", "1", "0", "1", "0", "1", "1")),
class = "data.frame", row.names = c(NA, -12L))

df1
   year county party list_position elected
1  2013      A    P1             2       1
2  2013      A    P1             3       0
3  2013      A    P1             1       1
4  2013      B    P1             3       0
5  2013      B    P1             2       0
6  2013      B    P1             1       1
7  2017      A    P1             2       1
8  2017      A    P1             3       0
9  2017      A    P1             1       1
10 2017      B    P1             3       0
11 2017      B    P1             2       1
12 2017      B    P1             1       1
  

где list_position содержит информацию о том, какую позицию в избирательном списке занимает кандидат от политической party (данные содержат несколько партий, а не только P1 ) в заданном year и county . Теперь мне нужна новая переменная, содержащая информацию о максимальном значении list_position , при котором был избран кандидат. Это будет выглядеть следующим образом:

    year county party list_position elected max_list_position
1  2013      A    P1             2       1                 2
2  2013      A    P1             3       0                 2
3  2013      A    P1             1       1                 2
4  2013      B    P1             3       0                 1
5  2013      B    P1             2       0                 1
6  2013      B    P1             1       1                 1
7  2017      A    P1             2       1                 2
8  2017      A    P1             3       0                 2
9  2017      A    P1             1       1                 2
10 2017      B    P1             3       0                 3
11 2017      B    P1             2       1                 3
12 2017      B    P1             1       1                 3
  

Я пытался

 df1 <- df1 %>% 
  group_by(year, county, party) %>%
  mutate(max_list_position= max(list_position [elected == 1])) %>%
  ungroup()
  

но по какой-то причине R дает мне -Inf значения для некоторых наблюдений для max_list_position

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

1. Имеют ли комбинации year-county-party с -Inf хотя бы одну строку с elected==1 ?

2. нет … это проблема?

Ответ №1:

Работает ли это:

 library(dplyr)
df1 %>% type.convert(as.is = T) %>% group_by(year, county) %>% 
mutate(max_list_position = max(list_position[elected==1])[1])
# A tibble: 12 x 6
# Groups:   year, county [4]
    year county party list_position elected max_list_position
   <int> <chr>  <chr>         <int>   <int>             <int>
 1  2013 A      P1                2       1                 2
 2  2013 A      P1                3       0                 2
 3  2013 A      P1                1       1                 2
 4  2013 B      P1                3       0                 1
 5  2013 B      P1                2       0                 1
 6  2013 B      P1                1       1                 1
 7  2017 A      P1                2       1                 2
 8  2017 A      P1                3       0                 2
 9  2017 A      P1                1       1                 2
10  2017 B      P1                3       0                 2
11  2017 B      P1                2       1                 2
12  2017 B      P1                1       1                 2
> 
  

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

1. нет, к сожалению, все еще есть наблюдения с -Inf

2. @nick_dataFE, если у вас нет избранных кандидатов, каким вы хотите, чтобы результат в новом столбце был? Кроме того, можете ли вы включить такие случаи в свои те же данные?

Ответ №2:

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