Разница между двумя старшими числами в столбце в R - PullRequest
0 голосов
/ 08 ноября 2018

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

  NUM_TURNO CODIGO_MUNICIPIO SIGLA_PARTIDO     SHARE
1         1            81825           PPB 38.713318
2         1            81825          PMDB 61.286682
3         1            09717          PMDB 48.025900
4         1            09717            PL  1.279217
5         1            09717           PFL 50.694883
6         1            61921          PMDB 51.793868

Это дата-фрейм выборов в Бразилии. Группировка по NUM_TURNO и CODGIDO_MUNICIPIO Я хочу сравнить ДЕЛУ ПЕРВОЙ и ВТОРОЙ наиболее голосуемых политик в каждом городе и раунде (1 или 2) и создать новый столбец.
Что у меня за проблема? Я не знаю, как рассчитать разницу только для двух самых больших акций.

Например, в первом случае я хочу создать что-то, что даст мне разницу между 61.286682 и 38.713318 = 22.573364 и т. Д.

Примерно так:

df %>%
    group_by(NUM_TURNO, CODIGO_MUNICIPIO) %>%
    mutate(Diff = HIGHER SHARE - 2º HIGHER SHARE))

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Вы также можете использовать top_n из dplyr для группировки и суммирования. Имейте в виду, что в предоставленных вами данных вы получите ошибку в summarize, если вы используете diff с одним значением, следовательно, использование ifelse.

df %>%
  group_by(NUM_TURNO, CODIGO_MUNICIPIO) %>%
  top_n(2, SHARE) %>% 
  summarize(Diff = ifelse(n() == 1, NA, diff(SHARE)))

# A tibble: 3 x 3
# Groups:   NUM_TURNO [?]
  NUM_TURNO CODIGO_MUNICIPIO  Diff
      <dbl>            <dbl> <dbl>
1         1             9717  2.67
2         1            61921 NA   
3         1            81825 22.6 
0 голосов
/ 08 ноября 2018

Вы можете расположить свой фрейм данных по Share, а затем slice по первым двум значениям. Затем вы можете использовать summarise, чтобы получить разницу между значениями для каждой группы:

library(dplyr)
df %>%
    group_by(NUM_TURNO, CODIGO_MUNICIPIO) %>%
    arrange(desc(Share)) %>%
    slice(1:2) %>%
    summarise(Diff = -diff(Share))
...