如何根据某些观察结果运行函数?

时间:2019-08-01 17:36:48

标签: r lapply

我正在根据他们在该地区获得的选票数来计算各政党在给定选举中每个地区赢得的席位数量。

R中有一个函数可以对每个区域执行此操作:

seats_ha(party, votes, seats, method="dhondt")

第一个参数提供了一个政党名单名称的向量,第二个参数提供了一个政党在一个地区中赢得的投票总数的向量,座位数=给定地区的座位数,该方法是所使用的选举公式将选票转换成席位。我能够做的是通过在选举年度中按单个区域单独对数据进行分组来计算此结果。我的问题是,在3个选举年中,我有〜27个地区。

所以我的数据如下:

year   region dist_seat  party_name party_vote reg_id cong_id
2016-2021 AMAZONAS   2          UPP     0            1       3
2016-2021 AMAZONAS   2          FP      51067        1       3
2016-2021 AMAZONAS   2          AP      11992        1       3
2016-2021   ANCASH   5          FE       4534        2       3
2016-2021   ANCASH   5          UPP     0            2       3

我希望能够每年在每个地区运行该功能。

1 个答案:

答案 0 :(得分:1)

考虑by,这是tapply的面向对象的包装器,它按一列或多列对数据帧进行切片以运行所需的操作。 by的FUN的输入参数始终是一个子集数据帧,输出始终是返回的任何函数的列表,这里是seat_ha的返回。

您甚至可以将新列添加到子数据框,然后为单个数据框添加do.call + rbind的结果。在tryCatch下确保始终填充新列:seats_haNA的实际结果(如果遇到错误)。

BUILD LIST OF SUBSETTED DFs
df_list <- by(mydata, mydata[,c("year", "region")], FUN=function(sub) {
                 # ADD NEW COLUMN TO sub DF
                 sub$calc_seat <- tryCatch(with(sub, seats_ha(party_name, party_vote, 
                                                              dist_seat, method="dhondt")), 
                                           error = function(e) NA)
                 return(sub)
             })

# ROW BIND ALL DFs
final_df <- do.call(rbind, df_list)