【问题标题】:R partial string matching between two elements of two vectors, anywhere within element两个向量的两个元素之间的R部分字符串匹配,元素内的任何位置
【发布时间】:2017-10-25 03:50:02
【问题描述】:

我正在尝试将向量 (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)的元素,但是这个字符也可以出现在(a)的元素中,这样也行不通。

非常感谢任何帮助!

【问题讨论】:

    标签: r


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      使用来自purrr 的安全类型map_dbl(link 到 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多