我在数据框中有两列,其中包含我想要比较的字符串。第一个是字符串向量,第二个是每个元素中都有一个迷你字符串向量的列表。想象一下有一个像这样的数据框:
V L
"Anameone" "name" "asd"
"Bnametwo" "dfg"
"Cnamethree" "hey" "C" "hi"
我想看看L的第一个元素中的某些单词是否出现在V的第一个元素中,L的第二个元素中的某些单词是否出现在V的第二个元素中......等等上。
我可以用这样的循环来做我想做的事:
for (i in c(1:3)){
df$matches[i] <- any(df$L[[i]],grepl, df$V[i],ignore.case = T))
}
因此输出为:
> df$matches
[1] "TRUE" "FALSE" "TRUE"
但实际上我有大约 100.000 个而不是 3 行,而且确实花费了太长时间。我一直无法弄清楚如何更有效地做到这一点,有什么想法吗?我所有其他不使用索引的尝试最终都得到了本例中的 3x3 矩阵,因为它比较“all with all”,而且我认为这可能仍然比 for 更糟糕。
最佳答案
您可以使用purrr::map2_lgl()
迭代两列,测试 l
的每个元素是否在 v
中,且 stringr::str_detect()
,然后使用 any()
获取 TRUE
或 FALSE
(如果有任何匹配项)。
library(dplyr)
library(purrr)
library(stringr)
df <- tibble(
v = c("Anameone", "Bnametwo", "Cnamethree"),
l = list(c("name", "asd"), "dfg", c("hey", "C", "hi"))
)
mutate(df, matches = map2_lgl(v, l, ~ str_detect(.x, .y) %>% any()))
#> # A tibble: 3 x 3
#> v l matches
#> <chr> <list> <lgl>
#> 1 Anameone <chr [2]> TRUE
#> 2 Bnametwo <chr [1]> FALSE
#> 3 Cnamethree <chr [3]> TRUE
关于r - 查找字符串列表的每个元素与 R 中向量的每个字符串之间的匹配(避免 'for' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44332906/