Как разбить строку на основе точки с запятой после условной цифры - PullRequest
0 голосов
/ 19 мая 2019

Я работаю в 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]]
}

Может ли кто-нибудь помочь мне понять, что мне нужно сделать, чтобы сделать это разделение по желанию?

1 Ответ

1 голос
/ 19 мая 2019

Разделение и рекомбинация на ;, с простым захватом регулярных выражений между ними.

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"              
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...