一个选项是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))