我有一对包含在数据框中的字符串:
df <- data.frame(str = c("L_V1_ROI-L_MST_ROI",
"L_V6_ROI-L_V2_ROI",
"L_V3_ROI-L_V4_ROI",
"L_V8_ROI-L_4_ROI",
"L_p9-46v_ROI-L_a9-46v_ROI"))
每对由-
符号分隔,但最后一对包含三个-
符号除外,应分为子串L_p9-46v_ROI
和L_a9-46v_ROI
。
任务是根据分隔符将这些对分成子串。要做到这一点,我只需使用:
library(tidyr)
df %>% separate(data = df, col = str, into = c("str1", "str2"), sep = "-")
得出以下结果:
str1 str2
1 L_V1_ROI L_MST_ROI
2 L_V6_ROI L_V2_ROI
3 L_V3_ROI L_V4_ROI
4 L_V8_ROI L_4_ROI
5 L_p9 46v_ROI
Warning message:
Too many values at 1 locations: 5
正如所料,问题在于第5对有多个-
符号。
问题:匹配正确的分隔符的正则表达式是什么?
我的部分解决方案粘贴在下面,但我希望应该有更智能的解决方案。
my_split <- function(string, pattern) {
## Match start end end position of the "_ROI-"
position <- str_locate(string = string, pattern = pattern)
start <- position[1]
end <- position[2]
## Extract substrings
substring1 <- substr(my_str, 1, start + 3)
substring2 <- substr(my_str, end + 1, nchar(string))
return(list(substring1, substring2))
}
## Toy example
my_str <- "L_p9-46v_ROI-L_a9-46v_ROI"
my_split(string = my_str, pattern = "_ROI-")
[[1]]
[1] "L_p9-46v_ROI"
[[2]]
[1] "L_a9-46v_ROI"