使用R语言grepl函数在DataFrame中进行模式匹配的问题求助
问题解决:R语言中grepl匹配DataFrame政党一致性的错误修正
核心问题分析
你的代码存在两个关键问题:
- 变量名错误:代码中使用了
national.coalition和county.party,但原始数据框的列名实际是national.party和district.party,这是导致2001年1002地区结果错误的直接原因。 - 正则匹配的潜在风险:直接使用
grepl进行正则匹配,若政党名称存在包含关系(如PartyA和PartyAA),会出现子串误匹配的问题。
解决方案
方案一:修正变量名的极简版
如果你的政党名称不存在包含关系,直接修正变量名即可得到正确结果:
library(dplyr) df.1.neat.fix <- df.1 %>% mutate(alignment = grepl(national.party, district.party))
该代码会逐行用national.party的正则模式(如PartyA|PartyB)匹配district.party,完全符合你“至少一个全国执政党在地区执政即视为一致”的逻辑。
方案二:拆分匹配的严谨版
为避免子串误匹配的风险,推荐将政党列表拆分后检查交集,逻辑更清晰且鲁棒性更强:
library(dplyr) library(stringr) library(purrr) df.1.neat.fix <- df.1 %>% # 将全国政党按|拆分为列表 mutate(national_parties = str_split(national.party, "\\|")) %>% # 将地区政党按-拆分为列表 mutate(district_parties = str_split(district.party, "-")) %>% # 逐行检查两个政党列表是否存在交集 mutate(alignment = map2_lgl(national_parties, district_parties, ~any(.x %in% .y))) %>% # 移除临时生成的中间列(可选) select(-national_parties, -district_parties)
结果验证
两种方案运行后,生成的alignment列均与你提供的df.1.neat中的预期结果完全一致。
内容的提问来源于stack exchange,提问作者YouLocalRUser
相关产品推荐
相关产品推荐

