我正在R中使用如下字符串:
"a1_1;a1_2;a1_5;a1_6;a1_8"
"two1_1;two1_4;two1_5;two1_7"
我需要根据最后一个数字是否小于7将这些字符串分成两个字符串。例如,上面两个字符串的期望输出为:
"a1_1;a1_2;a1_5;a1_6" "a1_8"
"two1_1;two1_4;two1_5" "two1_7"
我尝试以下操作均无济于事:
x <- "a1_1;a1_2;a1_5;a1_6;a1_8"
str_split("x", "(\\d<7);")
在该问题的较早版本中,有人提供了以下功能来帮助我,但我不认为它可以处理上面字符串中的分号前后的数字。我正在尝试修改它,但无法使其正确显示。
f1 <- function(strn) {
strsplit(gsubfn("(;[A-Za-z]+\\d+)", ~ if(readr::parse_number(x) >= 7)
paste0(",", sub(";", "", x)) else x, strn), ",")[[1]]
}
任何人都可以帮助我了解如何根据需要进行拆分吗?
答案 0 :(得分:1)
在;
上拆分和重组,并在它们之间进行简单的正则表达式捕获。
s <- c("a1_1;a1_2;a1_5;a1_6;a1_8", "two1_1;two1_4;two1_5;two1_7")
sp <- strsplit(s, ";")
lapply(sp,
function(x) {
l <- sub(".*(\\d)$", "\\1", x) < 7
c(paste(x[l], collapse=";"), paste(x[!l], collapse=";"))
}
)
# [[1]]
# [1] "a1_1;a1_2;a1_5;a1_6" "a1_8"
#
# [[2]]
# [1] "two1_1;two1_4;two1_5" "two1_7"