R语言技术需求:创建矩阵第N位元素变量及优化选区获胜党变量
帮你解决R语言选举数据处理的两个问题
别担心呀!从SPSS转R的初期肯定会有点手生,慢慢来就顺手了~我帮你把这两个需求都梳理清楚:
一、完善获取各选区获胜党的函数
你已经有了函数的雏形,我帮你补全并优化一下,确保能正确返回每个选区得票最高的政党,还考虑了平局的特殊情况:
# 定义获胜党函数 winner <- function(votes, party_labels) { # 获取最高得票数,加na.rm避免NA值干扰计算 most_votes <- max(votes, na.rm = TRUE) # 找到所有得票等于最高值的政党索引 top_indices <- which(votes == most_votes) # 处理平局情况:如果多个政党得票相同,返回"平局";否则返回对应政党 if (length(top_indices) > 1) { return("平局") } else { return(party_labels[top_indices]) } }
使用示例
假设你的数据框election_results里,前几列是各政党的得票数据,最后一列是选区名称,政党标签就是这些得票列的列名:
# 用基础R给每个选区添加获胜党列 election_results$winning_party <- apply( election_results[, -ncol(election_results)], 1, winner, party_labels = colnames(election_results[, -ncol(election_results)]) )
推荐新手学习dplyr,语法更贴近自然语言,用它实现会更直观:
library(dplyr) election_results <- election_results %>% rowwise() %>% mutate(winning_party = winner( c_across(starts_with("party_")), # 假设政党列以"party_"开头 party_labels = colnames(.)[starts_with("party_")] )) %>% ungroup()
二、创建新变量显示个案的第N位元素
这里分两种常见场景处理:
场景1:提取每一行第N个列的原始值
比如要提取每一行第3列的值,创建新变量nth_element:
# 基础R写法 election_results$nth_element <- election_results[, 3] # dplyr写法(更灵活,支持按列名筛选) N <- 3 target_col <- colnames(election_results)[N] election_results <- election_results %>% mutate(nth_element = .data[[target_col]])
场景2:提取每一行得票第N高的政党
如果需求是找出每个选区得票排第N位的政党,可以这样写:
N <- 2 # 比如找得票第二高的政党 party_cols <- colnames(election_results)[starts_with("party_")] election_results <- election_results %>% rowwise() %>% mutate( nth_party = party_cols[order(c_across(all_of(party_cols)), decreasing = TRUE)[N]] ) %>% ungroup()
内容的提问来源于stack exchange,提问作者Hannah
相关产品推荐
相关产品推荐

