r - 查找字符串列表的每个元素与 R 中向量的每个字符串之间的匹配(避免 'for' )

标签 r list for-loop vector grepl

我在数据框中有两列,其中包含我想要比较的字符串。第一个是字符串向量,第二个是每个元素中都有一个迷你字符串向量的列表。想象一下有一个像这样的数据框:

    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() 获取 TRUEFALSE(如果有任何匹配项)。

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/

相关文章:

r - 增加 ggplot 上轴线和绘图线之间的距离

r - ggplot2 geom_密度限制

c# - C#播放声音列表

javascript - 无法在同一个 if 语句中运行两个 for 循环语句?

javascript - 如何从其中的 for 循环退出(转义)一个函数?

python - 如何在 Python 和 R 之间交换 Msgpack 文件?

r - R 中有吸引力的 3D 绘图

list - Python __init__ 函数的变量标识 - 谁能解释一下?

c++ - 给定一个节点数为奇数的单链表,通过只遍历链表一次找到中间节点的两种方法是什么?

ios - 如何使用 for 循环在 Swift 3 中创建 Int 数组