定义子字符串是否匹配原始字符串的左侧或右侧

Define if substring is matching left or right part of original string

我有一个包含三个字符串的数据框,maturestarprecursormaturestar 列是 precursor 的子字符串。我想在数据框中添加一个新列,说明 mature 字符串是否与前体字符串的左侧或右侧匹配. 在我的示例中,第一行匹配其前体的左侧部分,第二行匹配其前体的右侧部分。左和右应定义为从前体字符串的中间开始。然而,子字符串并不总是在前体的最开始或最后,它从位置 2 或 3 开始。

有没有办法使用 stringr 或任何其他 R 程序包来做到这一点?

df <-     structure(list(mature = c("uggagugugacaaugguguuu", "cuauacaacuuacugucuuucc"
), star = c("aacgccauuaucacacuaaau", "ugagguaguagguuguauag"
), precursor = c("uggagugugacaaugguguuuguguccuccguaucaaacgccauuaucacacuaaau", 
"ugagguaguagguuguauaguuuuagggucauucccaagcugucagaugacuauacaacuuacugucuuucc"
)), row.names = 1:2, class = "data.frame")

我看了str_locate_all,它给了我成熟相对于前驱的位置。

> str_locate_all(pattern =df$mature, df$precursor)
[[1]]
     start end
[1,]     1  21

[[2]]
     start end
[1,]    51  72

这应该可以做到。您可以使用 str_detect() 并使用字符串正则表达式字符的开头和结尾,而不是使用 str_locate()

df %>% 
  mutate(mature_side = case_when(
    str_detect(precursor, paste0("^", mature)) ~ "Left", 
    str_detect(precursor, paste0(mature, "$")) ~ "Right", 
    TRUE ~ "Neither"
    
  ))

                  mature                  star                                                                precursor
# 1  uggagugugacaaugguguuu aacgccauuaucacacuaaau                uggagugugacaaugguguuuguguccuccguaucaaacgccauuaucacacuaaau
# 2 cuauacaacuuacugucuuucc  ugagguaguagguuguauag ugagguaguagguuguauaguuuuagggucauucccaagcugucagaugacuauacaacuuacugucuuucc
#   mature_side
# 1        Left
# 2       Right

您可以使用 str_locate :

library(stringr)
mat <- str_locate(df$precursor, df$mature)
ifelse(nchar(df$precursor)/2 > mat[, 1], 'left', 'right')
#[1] "left"  "right"

这里比较字符串的起始位置和字符串长度的一半,并赋值给'left''right'