В R, как я могу найти вхождение n последовательных чисел в строке символов - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть вектор символов с достаточно повторяемой структурой, который я хочу преобразовать в data.frame. На данный момент я отмечаю разделение между столбцами добавлением \t. Одним из полей является число, которое по крайней мере имеет 5 символов, поэтому я хотел бы найти, где оно начинается и заканчивается, чтобы добавить знак разделения на обоих концах.

Мой вектор похож на этот:

v_char <- c(
  "1 Name that may contain 2 number  1234567890 more content later",
  "2 Other name that doesn't have a number  1234567870 more content later"
)

Я хотел бы получить этот вектор:

out_v_char <- c(
  "1 Name that may contain 2 number  \t1234567890\t more content later",
  "2 Other name that doesn't have a number  \t1234567870\t more content later"
)

Мне не удалось найти выражение регулярного выражения, чтобы отметить последовательное появление чисел, а затем найти их начало и конец. Я достиг позиции блоков следующим образом, но это кажется излишним:

digits <- gregexpr("[0-9]", v_char)
f_tmp <- function(v) {
  cumsum(c(1L, diff(v) > 1))
}
blocks <- lapply(digits, f_tmp)
f_tmp2 <- function(v, n = 5L) {
  tb <- table(v)
  first_consecutive <- min(names(tb)[tb > n])
  return(c(start = head(which(
    v == first_consecutive
  ), 1L),
  end = tail(which(
    v == first_consecutive
  ), 1L)))
}
positions <- lapply(blocks, f_tmp2)

1 Ответ

1 голос
/ 16 апреля 2020

Мы можем на самом деле просто использовать gsub здесь

gsub("(\\d{5,})", "\t\\1\t", v_char)

Это регулярное выражение сопоставляет и захватывает последовательность из 5 или более ("{5,}") цифр ("\ d") , Затем gsub берет захваченное совпадение ("\ 1") и добавляет вкладки до и после него перед заменой значения в строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...