R语言逐行查找数据框指定多字符串并生成匹配列名新变量问题
R数据框逐行匹配指定字符串并返回对应列名的实现方案
以下提供两种可直接运行的实现方案:
方案1:tidyverse(dplyr+stringr)实现
贴合你尝试的mutate写法逻辑,可读性高:
library(dplyr) library(stringr) # 定义目标匹配字符串和正则规则 strings <- c("Tree", "Plant") pattern <- paste(strings, collapse = "|") df <- df %>% # 按行处理 rowwise() %>% mutate(x1 = { # 逐行检测所有列是否匹配目标 match_pos <- str_detect(c_across(everything()), pattern) # 存在匹配返回第一个匹配列名,无匹配返回NA ifelse(any(match_pos), names(.)[which.max(match_pos)], NA_character_) }) %>% # 取消行分组避免影响后续操作 ungroup()
若某行存在多个匹配列,需要返回所有匹配列名时,可将
ifelse部分替换为:ifelse(any(match_pos), paste(names(.)[match_pos], collapse = ","), NA_character_)
方案2:base R实现
无需加载额外包,处理超大体积数据框时执行效率更高:
strings <- c("Tree", "Plant") pattern <- paste(strings, collapse = "|") df$x1 <- apply(df, 1, function(row) { match_col <- grepl(pattern, row) if (any(match_col)) names(row)[which.max(match_col)] else NA_character_ })
两种方案运行后输出结果与你预期的格式完全一致:
> head(df) var1 var2 var3 var4 x1 1 Goats cats cats Plant var4 2 Sheep Dog Dog Ant <NA> 3 Pigs birds birds Bee <NA> 4 Dog rabbits rabbits Tree var4 5 Zebu Plant horses Water buffaloes var2 6 Donkeys fish Sheep Donkeys <NA>
内容的提问来源于stack exchange,提问作者Sylv
相关产品推荐
相关产品推荐

