Один вариант - extract
из tidyr
library(tidyr)
library(dplyr)
df1 %>%
extract(data, into = c("first.letter", "number", "last.letter"),
"^([A-Z])(\\d+)([A-Z])$")
# first.letter number last.letter
#1 X 3 Y
#2 X 33 U
#3 Y 231 Z
Или с separate
df1 %>%
separate(data, into = c("first.letter", "number", "last.letter"),
sep= "(?<=[A-Z])(?=[0-9])|(?<=[0-9])(?=[A-Z])")
# first.letter number last.letter
#1 X 3 Y
#2 X 33 U
#3 Y 231 Z
Или другой вариант - strsplit
, а затем rbind
do.call(rbind, strsplit(df1$data,
"(?<=[A-Z])(?=[0-9])|(?<=[0-9])(?=[A-Z])", perl = TRUE))
данные
df1 <- structure(list(data = c("X3Y", "X33U", "Y231Z")),
class = "data.frame", row.names = c(NA, -3L))