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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:18:03