R中列中两个较高数字之间的差

时间:2018-11-08 16:43:07

标签: r dataframe calculator difference

我有一个像这样的数据框:

  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 :(得分:2)

您还可以将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 

答案 1 :(得分:1)

您可以按Share,然后按slice的前两个值排列数据框。然后,您可以使用summarise来获取每个组的值之间的差异:

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