首页 > 解决方案 > 如何确定向量中有多少元素包含来自第二个向量的模式?

问题描述

我试图确定一个向量是否包含多个模式。我有向量namespatterns.

对于一个简单的例子,我有:

names <- c("john_burgess", "pablo_gorges", "pear_trapper", "john_vaccant")

我想知道其中的哪些元素names包含以下模式之一:

patterns<- c("john", "gorge")

我的实际数据包括一个names[1:1126] 的patterns向量和一个 [1:1163] 的向量。我一次只能使用一种模式,例如“john”,但我想一次使用所有模式。我想要的输出看起来像这样(这样我就可以继续进行进一步的分析):

names         patterns
john_burgess  john
john_vaccant  john
pablo_gorges  gorge

grep我在浏览、stringr::str_extract和帮助文件时迷失了方向,dplyr::filter只有在我尝试使用多个模式时才会出现错误。我已经删除了 _ names,它没有任何区别。我知道这一定是可能的,而且它可能是一个简单的编码,但我就是无法让它工作。对不起,如果这个问题已经被问到并得到了回答(如果是这样,请指点我)!我真的很感激朝着正确的方向轻推。提前致谢!

标签: rdplyrstringr

解决方案


这是一个选项tidyverse

library(purrr)
library(tibble)
library(stringr)
map(set_names(patterns, patterns), ~ 
      names[str_detect(names, .x)], .id = 'patterns') %>%
   enframe(name = "patterns", value = "names") %>% 
   unnest(c(names))
# A tibble: 3 x 2
#  patterns names       
#  <chr>    <chr>       
#1 john     john_burgess
#2 john     john_vaccant
#3 gorge    pablo_gorges

或使用base R

stack(lapply(setNames(patterns, patterns), grep, x = names, value = TRUE))

推荐阅读