数据框中的 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_lgl
和grepl
df %>% mutate(truematch = purrr::map2_lgl(id, ids, grepl, fixed = TRUE))
但是,对于这种情况,更好的选择是 stringr::str_detect
,它在字符串和模式上进行矢量化
df %>% mutate(truematch = stringr::str_detect(ids, fixed(id)))
我正在尝试检查一列中的字符串是否出现在不同的列中。我试过 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_lgl
和grepl
df %>% mutate(truematch = purrr::map2_lgl(id, ids, grepl, fixed = TRUE))
但是,对于这种情况,更好的选择是 stringr::str_detect
,它在字符串和模式上进行矢量化
df %>% mutate(truematch = stringr::str_detect(ids, fixed(id)))