R两个向量的两个元素之间的部分字符串匹配,在元素内的任何位置

时间:2017-10-25 03:50:03

标签: r

我试图将向量(b)的元素与向量(a)的元素进行匹配,其中向量(b)的每个元素在其末尾具有向量(a)的一个元素。解决方案应该返回一个长度为(b)的向量,其中包含(a)中匹配的索引。

所以,例如:

a<-c('R2','R3','N_3','R1')

b<-c('sp_one_R1', 'sp_one_N_3', 'sp_two_R3')

some.function(a,b)

should give:
[1] 4 3 2 

我已经调查了pmatch和grep + lapply,但无法找到解决方案。我也想过将(b)的元素分解为&#39; _&#39;然而,这个角色也可以出现在(a)的元素中,因此也不会起作用。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

使用map_dbl中的类型安全purrrlink到Jenny BC的教程)我得到了

a<-c('R2','R3','N_3','R1')
b<-c('sp_one_R1', 'sp_one_N_3', 'sp_two_R3')

myfun <- function(source_vec, dest_vec) {
  purrr::map_dbl(source_vec, ~ which(stringr::str_detect(., dest_vec))[1])
}
myfun(b, a) # 4 3 2

答案 1 :(得分:1)

在基数R中,使用sapply,然后使用max.col查看匹配的值:

max.col(sapply(a, grepl, b))
#[1] 4 3 2

这是有效的,因为核心sapply部分返回此矩阵:

sapply(a, grepl, b)
#        R2    R3   N_3    R1
#[1,] FALSE FALSE FALSE  TRUE
#[2,] FALSE FALSE  TRUE FALSE
#[3,] FALSE  TRUE FALSE FALSE