R语言grepl()函数匹配异常:逐行匹配成功整列匹配无结果
问题原因
grepl()的pattern参数如果传入长度大于1的向量,只会取向量的第一个元素,用它去匹配整个x向量(也就是你的wtf$Match_addr)。如果你的wtf$loc[1]并不存在于任何一行的Match_addr中,自然会返回全FALSE,导致最终得到空表。如果你的R环境没有禁用警告,执行这行代码时应该会弹出类似「pattern has length >1 and only the first element will be used」的提示。
而你逐行执行grepl(wtf$loc[n], wtf$Match_addr[n])时,是用单个字符串作为pattern去匹配单个目标字符串,这符合grepl()的常规单值匹配逻辑,所以能得到正确的TRUE结果。
解决方法
要实现逐行对应匹配(即第n行的loc匹配第n行的Match_addr),可以用以下几种方式处理:
- 方法1:用
mapply()实现逐元素映射
matches <- mapply(grepl, pattern = wtf$loc, x = wtf$Match_addr) matching_rows <- wtf[matches, ]
- 方法2:用
Vectorize()包装grepl,生成支持向量对向量匹配的函数
vectorized_grepl <- Vectorize(grepl, vectorize.args = c("pattern", "x")) matches <- vectorized_grepl(wtf$loc, wtf$Match_addr) matching_rows <- wtf[matches, ]
- 方法3:用
purrr包的map2_lgl(适合tidyverse生态用户)
library(purrr) matches <- map2_lgl(wtf$loc, wtf$Match_addr, grepl) matching_rows <- wtf[matches, ]
额外提醒:如果wtf$loc中包含正则表达式元字符(比如.、*、+等),可能会导致意外匹配失败,这种情况可以给grepl()加上fixed = TRUE参数,强制进行精确字符串匹配:
matches <- mapply(grepl, pattern = wtf$loc, x = wtf$Match_addr, fixed = TRUE)
内容的提问来源于stack exchange,提问作者amcameron
相关产品推荐
相关产品推荐

