Расщепление строк по случаю - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть большой текстовый фрейм данных (около 100 тыс. Строк), где каждая строка представляет собой строку, которая содержит первые строчные буквы, а затем заглавные буквы с пробелами между ними. Например, ниже:

df1 <- data.frame(a = c('lowercase U P P E R C A S E', 'letters N U M B E R S'), 
                  stringsAsFactors = FALSE)
df1

Я пытаюсь разбить строку в точке, где она становится заглавной, и переместить заглавные буквы в новый столбец (при этом удаляя их из исходного столбца). Тогда желаемый результат будет выглядеть так:

df2 <- data.frame(a = c('lowercase', 'letters'),
                  b = c('U P P E R C A S E', 'N U M B E R S'),
                  stringsAsFactors = FALSE)
df2

Я, честно говоря, не уверен, с чего начать делать что-то подобное. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Есть много разных способов сделать это, но подавляющее большинство из них будет использовать Регулярные выражения

В базе 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]) - это упреждающий просмотр, который будет соответствовать любая заглавная буква. Поскольку между предварительным просмотром и предварительным просмотром существует пробел, он разделяет строку первым пробелом, который идет непосредственно после строчной буквы и непосредственно перед заглавной буквой, что характеризует пробел, разделяющий два столбца, которые вы пытаетесь выполнить. создать.

0 голосов
/ 21 февраля 2020

Мы можем использовать tidyr::extract

tidyr::extract(df1, a, c("a", "b"), "([a-z]+)([A-Z\\s]+)")

#          a                  b
#1 lowercase  U P P E R C A S E
#2   letters      N U M B E R S
...