我在试着
的长度
任何帮助都将不胜感激!
ip <- structure(list(V1 = c("ab---cdef", "abcd---ef", "a--bc--def"),
V2 = c("xxxxxxxyy", "xxxxxyyyy", "xxxyyyzzzz")), class = "data.frame", row.names = c(NA,
-3L))我尝试了stringi_locate,但它输出了单个位置。例如,对于这个“ab--cdef”,而不是3-5,它输出3-3,4-4,5-5。
预期产出:
op <- structure(list(V1 = c("ab---cdef", "abcd---ef", "a--bc--def"),
V2 = c("xxxxxxxyy", "xxxxxyyyy", "xxxyyyzzzz"), output = c("x:x-3:5-3",
"x:y-5:7-3", "x:x-2:3-2; y-z:6:7-2")), class = "data.frame", row.names = c(NA,
-3L))输出列必须具有
position
V1 V2 output
ab---cdef xxxxxxxyy x:x-3:5-3谢谢!
发布于 2021-10-26 17:54:27
下面是一个使用grepexpr获取字符串中所有匹配的示例。
x <- gregexpr("-+", ip$V1)
mapply(function(m, s, r) {
start <- m
len <- attr(m, "match.length")
end <- start + len-1
part <- mapply(substr, r, start, end)
paste0(part, "-", start, ":", end, "-", len, collapse=";")
}, x, ip$V1, ip$V2)
# [1] "xxx-3:5-3"
# [2] "xyy-5:7-3"
# [3] "xx-2:3-2;yz-6:7-2"我不知道您将xxx转换为x:x或xyy到x-y的逻辑是什么,也不知道如何将其推广到其他序列,因此可以随意更改该部分。但是,您可以使用返回的match对象的属性获取匹配的开始和长度。使用-+作为模式非常重要,因此您可以匹配一次破折号,而不仅仅是一个破折号。
https://stackoverflow.com/questions/69727575
复制相似问题