Мы можем использовать регулярные выражения для этого. Здесь сопоставляемый шаблон представляет собой один или несколько пробелов (\\s+
), предшествующих одному или нескольким непробельным пробелам (\\S+
) до конца ($
) строки
library(dplyr)
library(tidyr)
df %>%
separate(a, into = c('a', 'b'), "\\s+(?=\\S+$)")
Или с шаблоном OP, т. Е. Для соответствия одному или нескольким пробелам (\\s+
), предшествующим заглавной букве ([[:upper:]]
или [A-Z]
)
df %>%
separate(a, into = c('a', 'b'), "\\s+(?=[[:upper:]])")
# a b
#1 Hello abc AA
#2 bcc BB
#3 xaa X
#4 axd LSE
Или другой вариант extract
где мы фиксируем как группы
df %>%
extract(a, into = c('a', 'b'), '^(.*) (\\S+)$')
# a b
#1 Hello abc AA
#2 bcc BB
#3 xaa X
#4 axd LSE
A base R
, опция strsplit
do.call(rbind, strsplit(df$a, "\\s(?=[A-Z])", perl = TRUE))
Или с read.csv
read.csv(text = sub("\\s(?=[A-Z])", ',', df$a, perl = TRUE),
header = FALSE, col.names = c('a', 'b'))
данные
df <- structure(list(a = c("Hello abc AA", "bcc BB", "xaa X", "axd LSE"
)), class = "data.frame", row.names = c(NA, -4L))