如何在R语言中批量指定多列用grepl+ifelse搜索字符串
问题与解决方案
问题说明
假设存在如下R语言DataFrame:
immed_cause_death consq1 consq2 consq3 quetapine cocaine heroin meth meth heroin thc alcohol alcohol meth
需要新增一列antipsychotics:只要immed_cause_death、consq1、consq2、consq3任意一列中包含字符串Quetiapine(忽略大小写),就赋值为1,否则为空字符串。原实现是逐个列调用grepl,现在希望通过指定列范围批量处理,避免重复代码。
解决方案
首先要正确定义列名向量(需为字符串格式):
search_cols <- c("immed_cause_death", "consq1", "consq2", "consq3")
方法1:用apply按行检查匹配
df$antipsychotics <- ifelse( apply(df[search_cols], 1, function(row) any(grepl('Quetiapine', row, ignore.case = TRUE))), 1, "" )
- 逻辑:
apply(df[search_cols], 1, ...)按行遍历指定列;grepl检查当前行每个元素是否匹配目标字符串;any()判断该行是否存在至少一个匹配项;最后用ifelse输出对应结果。
方法2:用rowSums统计匹配次数
# 生成匹配结果的逻辑矩阵 match_result <- grepl('Quetiapine', df[search_cols], ignore.case = TRUE) # 按行求和,忽略NA,大于0则说明有匹配 df$antipsychotics <- ifelse(rowSums(match_result, na.rm = TRUE) > 0, 1, "")
- 逻辑:
grepl直接作用于列子集,返回一个逻辑矩阵(每个元素表示是否匹配);rowSums统计每行的匹配数量,忽略空值(NA);只要数量大于0就赋值1,否则为空字符串。
两种方法都能实现与原代码完全一致的效果,且后续修改列范围只需调整search_cols向量即可,更易维护。
内容的提问来源于stack exchange,提问作者DiamondJoe12
相关产品推荐
相关产品推荐

