定义子字符串是否匹配原始字符串的左侧或右侧
Define if substring is matching left or right part of original string
我有一个包含三个字符串的数据框,mature
、star
和 precursor
。
mature
和 star
列是 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'
。
我有一个包含三个字符串的数据框,mature
、star
和 precursor
。
mature
和 star
列是 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'
。