Есть много разных способов сделать это, но подавляющее большинство из них будет использовать Регулярные выражения
В базе R вы можете сделать:
df3 <- data.frame(
a = gsub(pattern = "^([a-z]+) (([A-Z] )*[A-Z])$", replacement = "\\1", x = df1$a),
b = gsub(pattern = "^([a-z]+) (([A-Z] )*[A-Z])$", replacement = "\\2", x = df1$a),
stringsAsFactors = FALSE)
Здесь функция gsub
захватывает строчные буквы в первой группе ([a-z]+)
, а затем захватывает чередующиеся заглавные буквы и пробелы во второй группе (([A-Z] )*[A-Z])
. Затем он заменяет всю строку содержимым первой группы для столбца a и содержимым второй группы для столбца b.
Другой подход, на этот раз с использованием упреждающего просмотра и обратного просмотра, а также separate
функция из пакета tidyr
:
df4 <- tidyr::separate(df1,
col = a,
into = c("a", "b"),
sep = "(?<=[a-z]) (?=[A-Z])")
Здесь (?<=[a-z])
- это упор, который будет соответствовать любой строчной букве, а (?=[A-Z])
- это упреждающий просмотр, который будет соответствовать любая заглавная буква. Поскольку между предварительным просмотром и предварительным просмотром существует пробел, он разделяет строку первым пробелом, который идет непосредственно после строчной буквы и непосредственно перед заглавной буквой, что характеризует пробел, разделяющий два столбца, которые вы пытаетесь выполнить. создать.