将多国家政党选择变量合并为统一是非变量的技术求助
解决方案
不需要单独为每个国家生成是非变量再合并,直接通过逻辑判断或变量合并就能一步生成目标变量,以下是两种常用的实现方式:
场景1:每个受访者仅对应一个东道国(更符合研究场景)
如果你的数据中每个土耳其侨民只属于一个欧洲东道国(即仅对应国家的投票变量有值,其余三个为NA),可以先用coalesce合并四个国家的投票变量,再转换为0/1/NA的数值型变量:
library(dplyr) # 第一步:合并四个国家的投票变量为统一的原始字段 D <- D %>% mutate(host_vote_raw = coalesce(partyvotedger, partyvotedfra, partyvotednl, partyvoteduk)) # 第二步:转换为与vote_turkey一致的0/1/NA变量 D <- D %>% mutate( vote_host = case_when( host_vote_raw == "none" ~ 0, # "none"对应未投票 !is.na(host_vote_raw) ~ 1, # 政党名称对应已投票 TRUE ~ NA_real_ # 全NA时保留缺失值 ) )
如果需要生成"yes"/"no"/NA的字符型变量,只需修改case_when的输出:
D <- D %>% mutate( vote_host_char = case_when( host_vote_raw == "none" ~ "no", !is.na(host_vote_raw) ~ "yes", TRUE ~ NA_character_ ) )
场景2:受访者可能在多个东道国存在投票记录
如果存在同一受访者在多个国家有投票记录的情况,可直接通过逻辑判断生成目标变量:
library(dplyr) # 生成数值型0/1/NA变量 D <- D %>% mutate( vote_host = case_when( # 任意一个国家的变量为政党名称 → 已投票(1) (!is.na(partyvotedger) & partyvotedger != "none") | (!is.na(partyvotedfra) & partyvotedfra != "none") | (!is.na(partyvotednl) & partyvotednl != "none") | (!is.na(partyvoteduk) & partyvoteduk != "none") ~ 1, # 任意一个国家的变量为"none"且无政党记录 → 未投票(0) (!is.na(partyvotedger) & partyvotedger == "none") | (!is.na(partyvotedfra) & partyvotedfra == "none") | (!is.na(partyvotednl) & partyvotednl == "none") | (!is.na(partyvoteduk) & partyvoteduk == "none") ~ 0, # 其余情况(全NA)保留缺失值 TRUE ~ NA_real_ ) )
基础R实现(无需dplyr)
如果你习惯用基础R,可通过嵌套ifelse或apply函数实现:
# 合并原始变量(针对场景1) D$host_vote_raw <- apply(D[, c("partyvotedger", "partyvotedfra", "partyvotednl", "partyvoteduk")], 1, function(x) x[!is.na(x)][1]) # 转换为0/1/NA变量 D$vote_host <- ifelse(D$host_vote_raw == "none", 0, ifelse(!is.na(D$host_vote_raw), 1, NA))
内容的提问来源于stack exchange,提问作者sim Ke
相关产品推荐
相关产品推荐

