У меня есть вектор символов с достаточно повторяемой структурой, который я хочу преобразовать в 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)