数据框中的 R grepl

R grepl in dataframe

我正在尝试检查一列中的字符串是否出现在不同的列中。我试过 grepl:

grepl("b", "d,b,c", fixed = TRUE)
> TRUE

在 "standalone" 个对象上工作正常,但在数据框中:

 df = data.frame(id = c("a","b"), ids = c("b,c", "d,b,c")) %>%
     mutate(match = grepl(id, .$ids, fixed = TRUE), truematch = c(FALSE, TRUE))

> df
  id   ids match truematch
1  a   b,c FALSE     FALSE
2  b d,b,c FALSE      TRUE

它没有达到我的预期,即我正在尝试创建列 truematch 但我只能生成 match

通过在 grepl 上使用 sapply

 df %>%  mutate(match = sapply(1:nrow(.),function(x) grepl(.$id[x], .$ids[x])))

给予,

  id   ids  match
1  a   b,c FALSE
2  b d,b,c  TRUE

因为grepl没有矢量化,我们可以使用rowwise为每一行应用它

library(dplyr)

df %>%
  rowwise() %>%
  mutate(truematch = grepl(id, ids, fixed = TRUE))

#  id    ids   match truematch
#  <fct> <fct> <lgl> <lgl>    
#1 a     b,c   FALSE FALSE    
#2 b     d,b,c FALSE TRUE     

但是,rowwise有点过时了,我们可以使用purrr::map2_lglgrepl

df %>% mutate(truematch = purrr::map2_lgl(id, ids, grepl, fixed = TRUE))

但是,对于这种情况,更好的选择是 stringr::str_detect,它在字符串和模式上进行矢量化

df %>% mutate(truematch = stringr::str_detect(ids, fixed(id)))