如何用if else条件从三个不同DataFrame的向量中筛选特定姓名
问题原因和修正方法
你原代码的核心错误是对grepl、grep的用法理解有误,同时条件判断逻辑也存在问题:
grepl的正确用法是grepl(要匹配的内容, 要搜索的向量),你不仅写反了参数顺序,还错误添加了==,正确写法应为grepl(name, df1$NAME1)- if条件中不该使用
filter,要判断是否存在匹配项,应该用any()检查grepl返回的逻辑向量里是否有TRUE值 grep直接放入else if中会返回匹配的索引,无匹配时返回空向量,这种写法不符合条件判断的规范
方案1:提取匹配的姓名字符串
如果你的目标是获取三个DataFrame中包含指定名字的唯一姓名字符串,使用以下代码:
df1 <- data.frame(NAME1=c("MARIA APARECIDA", "JOSÉ CARLOS", "PEDRO PAULO BRAZ", "MÁRCIO TEELES","HUGO HOSEMAN"), col2=c("CONTROL", "EXPERIMENT", "EXPERIMENT", "CONTROL", "CONTROL"), col3 = c("none", "none", "none", "none", "none")) df2 <- data.frame(NAME2=c("MARIA APARECIDA", "JOSÉ NONATO ", "PAULO BRAZ CUNHA", "ALAN SIMON","BRITNEY HALLEN"), col2=c("CONTROL", "EXPERIMENT", "CONTROL", "CONTROL", "EXPERIMENT"), col3 = c("none", "none", "none", "none", "none")) df3 <- data.frame(NAME3=c("MERLY MATOS", "OSVALDO SIQUEIRA ", "ITANYA MARIA LOPES", "ZILCA COSTA","DIVONE FERRAZ"), col2=c("EXPERIMENT", "CONTROL", "EXPERIMENT", "CONTROL", "CONTROL"), col3 = c("none", "none", "none", "none", "none")) name <- "MARIA" # 先检查df1是否有匹配 if (any(grepl(name, df1$NAME1))) { result <- unique(grep(name, df1$NAME1, value = TRUE)) } else if (any(grepl(name, df2$NAME2))) { # 再检查df2 result <- unique(grep(name, df2$NAME2, value = TRUE)) } else { # 最后检查df3 result <- unique(grep(name, df3$NAME3, value = TRUE)) } print(result)
方案2:提取完整的匹配行(符合你的原始需求)
如果你的目标是提取包含指定名字的整行数据,可以使用以下代码:
name <- "MARIA" # 定义复用函数,提取指定DataFrame中匹配的行 get_matching_rows <- function(df, name_col, pattern) { df[grepl(pattern, df[[name_col]]), ] } # 按顺序检查三个DataFrame match_df1 <- get_matching_rows(df1, "NAME1", name) if (nrow(match_df1) > 0) { result <- match_df1 } else { match_df2 <- get_matching_rows(df2, "NAME2", name) if (nrow(match_df2) > 0) { result <- match_df2 } else { result <- get_matching_rows(df3, "NAME3", name) } } print(result)
补充提示
- 如果需要精确匹配名字/姓氏(比如避免“MARIA”出现在字符串中间的情况),可以调整正则表达式:匹配开头的名字用
grepl(paste0("^", name), 目标列),匹配独立的姓氏用grepl(paste0("\\b", name, "\\b"), 目标列)(\\b代表单词边界) - 如果三个DataFrame可能同时存在匹配项,且需要全部提取,直接合并三个结果即可,无需使用if-else判断
内容的提问来源于stack exchange,提问作者Kledson Lemes
相关产品推荐
相关产品推荐

