如何在R中实现Stata的inlist、ustrregexm功能完成program列批量赋值
R复现Stata字符串匹配赋值逻辑方案
需求说明
- 匹配条件1:
purposecode属于指定值列表:c(410, 41010, 41020, 41030, 41040, 41050, 41081, 41082) - 匹配条件2:
projecttitle、shortdescription、longdescription任意一列包含目标关键词:forest、wald、forêt、bosque、floresta、biodiver - 匹配条件3:
program列为空(未赋值) - 满足上述所有条件时,将
program列赋值为3
原代码报错原因
- 逻辑运算类型不匹配:
mutate()返回的是完整数据框,不能直接和逻辑值用&运算符做运算,触发类型错误 - 逻辑关系错误:需求是任意列包含关键词即可,原代码用
&要求所有列都匹配,和预期逻辑相反 - 语法冗余:不需要多次调用
mutate和case_when做重复判断
正确实现代码
Tidyverse(dplyr)版本
和你原代码使用的mutate语法兼容:
library(dplyr) # 提前定义匹配规则,方便后续修改 target_purpose <- c(410, 41010, 41020, 41030, 41040, 41050, 41081, 41082) keyword_pattern <- "forest|wald|forêt|bosque|floresta|biodiver" df <- df %>% mutate(program = case_when( is.na(program) & purposecode %in% target_purpose & (grepl(keyword_pattern, projecttitle, ignore.case = T) | grepl(keyword_pattern, shortdescription, ignore.case = T) | grepl(keyword_pattern, longdescription, ignore.case = T)) ~ 3, TRUE ~ program ))
基础R版本
无需加载第三方包,直接赋值:
target_purpose <- c(410, 41010, 41020, 41030, 41040, 41050, 41081, 41082) keyword_pattern <- "forest|wald|forêt|bosque|floresta|biodiver" match_index <- is.na(df$program) & df$purposecode %in% target_purpose & (grepl(keyword_pattern, df$projecttitle, ignore.case = T) | grepl(keyword_pattern, df$shortdescription, ignore.case = T) | grepl(keyword_pattern, df$longdescription, ignore.case = T)) df$program[match_index] <- 3
说明
代码中ignore.case = TRUE参数对应Stataustrregexm的第三个参数1,实现忽略大小写的匹配,和原Stata逻辑完全一致。
内容的提问来源于stack exchange,提问作者Vivi S
相关产品推荐
相关产品推荐

