如何在R中检查一列值是否包含另一列对应行的值?
解决R语言中逐行检查列值包含关系的问题
你遇到的警告是因为grepl()默认只接受单个匹配模式,当你传入长度大于1的pattern向量时,它会忽略后续元素只使用第一个,这就导致结果不符合预期还弹出警告。下面给你几个靠谱的解决思路:
方法1:用mapply()实现逐行匹配
mapply()可以把函数应用到多个向量的对应元素上,正好满足我们逐行检查的需求:
col1 <- c("R.S.U.L.C","S.I.W","P.U.E","A.E.N") col2 <- c("R","U","I","N") df2 <- data.frame(col1,col2) # 逐行调用grepl df2$Flag <- ifelse(mapply(grepl, pattern = df2$col2, x = df2$col1), "Yes", "No")
运行后df2$Flag会得到c("Yes", "No", "No", "Yes"),完全符合你的预期。
方法2:用stringr包的str_detect()(更简洁)
stringr包的str_detect()天生支持向量化的输入,不用额外处理就能直接逐行匹配:
# 先安装并加载包(如果没装过) install.packages("stringr") library(stringr) df2$Flag <- ifelse(str_detect(df2$col1, df2$col2), "Yes", "No")
这个方法代码更简洁,可读性也更高,是日常处理字符串匹配的首选方式之一。
方法3:用Vectorize()矢量化grepl
如果你不想用额外的包,也可以把基础的grepl()转换成支持矢量化的函数:
# 矢量化grepl vec_grepl <- Vectorize(grepl) df2$Flag <- ifelse(vec_grepl(df2$col2, df2$col1), "Yes", "No")
本质上和mapply()的逻辑类似,都是让grepl能逐个处理每个行的匹配对。
不管用哪种方法,最终都能得到你想要的Flag列结果:第一行和最后一行显示"Yes",第二、三行显示"No"。
内容的提问来源于stack exchange,提问作者Matt Gossett
相关产品推荐
相关产品推荐

