【问题标题】:Apply function within dplyr group在 dplyr 组内应用函数
【发布时间】:2019-11-27 09:00:01
【问题描述】:

我正在尝试使用选举包中的函数计算政党在市议会中应拥有的席位数量,并拥有一个按市政当局排序的长格式数据框。

但是,我似乎无法让该功能在组内工作,而是收到以下错误:

seats_ha 中的错误(派对 = 授权 $party,投票 = 授权 $votes,n_seats = 25,:每个派对名称必须是唯一的

我已尝试同时使用 do() 和 group_map(),因为这是该线程中建议的:Run a custom function on a data frame in R, by group,并且由于该函数预计返回多行值,而不是一个摘要,因此汇总不起作用价值。

我也尝试过使用coalitions 包中的dHondt()-function,但无济于事,只是另一个错误:

使用时:

错误:结果 1、2 必须是数据帧,而不是整数

使用 group_map 时:

错误:无法将整数向量转换为函数

有人知道如何解决这个问题吗? :)

一些示例代码:

library(tidyverse)
library(electoral)    
mandates <- data.frame(municipality = c("A","A","A","B","B","B"),
                           party = c("1","2","3","1","2","3"),
                           votes = c(125,522,231,115,321,12),
                           seats = c(25,25,25,25,25,25)) 
    mandates <- mandates %>% group_by(municipality) %>% 
            group_map(seats_ha(parties = mandates$party, votes = mandates$votes, n_seats = 25, method = "dhondt"))

最好我希望它使用 n_seats 的席位变量,因为每个城市的席位数量不同,但是让它与 25 个席位一起工作是一个好的开始。

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    在这种情况下,您可以简单地使用mutate

    mandates %>% group_by(municipality) %>% 
     mutate(x = seats_ha(parties = party, votes = votes, n_seats = 25, method = "dhondt"))
        # A tibble: 6 x 5
    # Groups:   municipality [2]
      municipality party votes seats     x
      <fct>        <fct> <dbl> <dbl> <int>
    1 A            1       125    25     3
    2 A            2       522    25    15
    3 A            3       231    25     7
    4 B            1       115    25     6
    5 B            2       321    25    19
    6 B            3        12    25     0
    

    当应用一个接受(一个或多个)向量参数并返回相同大小的向量的函数时,始终可以使用变异。

    如果您也想使用n_seats,您可以根据municipalityseats 进行分组(我假设每个市镇内的席位数量相同)。因此:

    mandates %>% group_by(municipality, seats) %>% 
     mutate(x = seats_ha(parties = party, votes = votes, n_seats = seats[1], method = "dhondt"))
    

    【讨论】:

    • 谢谢,这完全符合我的要求!对于第二部分,您知道使用座位变量而不是固定的 25 的简单方法吗?例如,如果 B 市有 27 个席位而不是 25 个?
    • 看我回答的第二部分
    • 非常感谢!我的回复太快了 :) 这很完美!
    猜你喜欢
    • 1970-01-01
    • 2018-10-27
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    相关资源
    最近更新 更多