如何基于unvotes包计算1990年后美德联大投票平均一致频率?
计算1990年以来美德联大投票一致频率的步骤
首先调整你的初始代码逻辑,filter应该放在group_by之前,先缩小数据集能提升后续计算效率,且原group_by的列不需要包含country和vote,我们要按决议和年份聚合两国的投票情况:
library(tidyverse) library(lubridate) library(unvotes) # 合并数据集(若未完成) merged <- un_votes %>% left_join(un_roll_calls, by = "rcid") countries <- c("United States", "Germany") # 第一步:过滤目标国家与时间范围的数据 filtered_data <- merged %>% filter(country %in% countries, year(date) >= 1990) %>% select(year = year(date), rcid, unres, country, vote)
接下来按决议(rcid对应单个联大决议)和年份分组,判断两国在同一决议上的投票是否一致:
# 第二步:按决议、年份分组,验证投票一致性 agreement_by_resolution <- filtered_data %>% group_by(year, rcid, unres) %>% # 确保每个决议都有两国的投票记录,排除缺失数据 filter(n() == 2) %>% # 两国投票相同时,唯一投票值数量为1,标记为一致 summarize( agreed = n_distinct(vote) == 1, .groups = "drop" )
然后计算每年的一致频率,以及1990年以来的整体平均一致频率:
# 第三步:计算年度一致频率 annual_agreement <- agreement_by_resolution %>% group_by(year) %>% summarize( total_resolutions = n(), agreed_resolutions = sum(agreed), agreement_frequency = agreed_resolutions / total_resolutions, .groups = "drop" ) # 第四步:计算1990年以来的加权平均一致频率 overall_average <- annual_agreement %>% summarize( overall_average_frequency = weighted.mean(agreement_frequency, total_resolutions) )
关键说明
n_distinct(vote) == 1:通过判断投票值的唯一数量,快速识别两国投票是否一致。weighted.mean:用每年的决议总数作为权重计算整体平均,比简单平均更贴合实际(不同年份决议数量差异大)。filter(n() == 2):排除某国缺席投票的决议,避免错误统计。
内容的提问来源于stack exchange,提问作者dilly
相关产品推荐
相关产品推荐

