You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

原代码报错原因

  1. 逻辑运算类型不匹配:mutate()返回的是完整数据框,不能直接和逻辑值用&运算符做运算,触发类型错误
  2. 逻辑关系错误:需求是任意列包含关键词即可,原代码用&要求所有列都匹配,和预期逻辑相反
  3. 语法冗余:不需要多次调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 21:45:04