R语言dplyr处理选举数据:省份得票前两名政党提取异常排查
选举结果数据提取省份得票Top2政党的问题
处理选举结果数据时,需要展示各省份得票最多和第二多的政党及其得票数,目前第一多的政党及得票能正常显示,但第二多的政党返回NA。
示例数据
structure(list(plaka = c("01", "01", "01", "01", "01", "01"), il_adi = c("ADANA", "ADANA", "ADANA", "ADANA", "ADANA", "ADANA" ), parti = c("MİLLET", "VATAN PARTİSİ", "CHP", "HAK-PAR", "SAADET", "DSP"), oy_2015 = c(482, 2841, 374000, 2581, 8001, 774)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
尝试的代码
mv_26 %>% group_by(il_adi) %>% arrange(il_adi,desc(oy_2015)) %>% slice(1:2) %>% summarise(win_party_2015 = parti[which.max(oy_2015)], win_party_p_2015 = max(oy_2015)/sum(oy_2015), second_2015 = parti[nth(oy_2015,index.return = 2)])
补充说明:需要在summarise()中实现需求,不能新建数据框,要基于原始数据集计算得票率等指标。
问题原因
nth函数参数错误:使用Rfast的nth时,index.return是逻辑值(TRUE/FALSE),不是数字,无法正确获取第二高得票的索引,导致parti取值返回NA。- 提前
slice(1:2)破坏原始数据:该操作会过滤掉其他政党的数据,导致sum(oy_2015)计算的是前两名得票之和,而非整个省份的总得票,不符合得票率的计算需求。
解决方案
以下两种方法均在summarise()内处理,保留原始数据集用于计算,同时正确提取Top2政党:
方案一:使用sort提取第二高得票值
mv_26 %>% group_by(il_adi) %>% summarise( win_party_2015 = parti[which.max(oy_2015)], win_party_p_2015 = max(oy_2015)/sum(oy_2015), # 提取第二高得票数量 second_votes_2015 = sort(oy_2015, decreasing = TRUE)[2], # 匹配对应的政党(若有多个政党并列第二,会返回多个值,可按需处理) second_party_2015 = parti[oy_2015 == second_votes_2015] )
方案二:使用dplyr的nth函数
mv_26 %>% group_by(il_adi) %>% summarise( win_party_2015 = parti[which.max(oy_2015)], win_party_p_2015 = max(oy_2015)/sum(oy_2015), # 按得票降序排序后取第2个政党和得票 second_party_2015 = nth(parti[order(-oy_2015)], 2), second_votes_2015 = nth(oy_2015[order(-oy_2015)], 2) )
方案三:使用Rfast的nth函数(正确参数)
mv_26 %>% group_by(il_adi) %>% summarise( win_party_2015 = parti[which.max(oy_2015)], win_party_p_2015 = max(oy_2015)/sum(oy_2015), # 用Rfast提取第二高得票值 second_votes_2015 = Rfast::nth(oy_2015, k=2, descending=TRUE), second_party_2015 = parti[oy_2015 == second_votes_2015] )
内容的提问来源于stack exchange,提问作者pimaniye41
相关产品推荐
相关产品推荐

