【问题标题】:How to run a function over certain observations?如何在某些观察结果上运行函数?
【发布时间】:2019-08-01 17:36:48
【问题描述】:

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

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

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

【问题讨论】:

  • dplyr::group_by

标签: r lapply


【解决方案1】:

考虑bytapply 的面向对象包装器,它将数据帧按一列或多列切片以运行所需的操作。 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)

【讨论】:

  • 我认为这非常有效!我想知道是否有办法将结果存储在与新数据列相同的数据集中?
  • 查看更新现在返回一个数据框,以便在外部进行行绑定。
猜你喜欢
  • 2020-08-22
  • 1970-01-01
  • 2020-08-09
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多