Первым шагом является объединение всех вхождений двух имен (Билли Боб, Джимм ie Сью и др. c.) В одно имя, чтобы мы получили Thorton,BillyBob
, а затем мы можем разделить пробел.
Шаблон, который мы ищем - lowercase space Uppercase
. Для этого используется следующее регулярное выражение:
pattern = stringr::regex("([a-z])( )([A-Z][a-z])")
data_join = gsub(pattern=pattern, replacement='\\1\\3', x=data, perl=TRUE)
Мы используем ()
в регулярном выражении для создания трех группировок: по одной для каждого элемента совпадения. При использовании gsub()
, указав replace='\\1\\3'
, мы говорим регулярному выражению оглянуться назад и использовать 1-й и 3-й элемент регулярного выражения в качестве замены и пропустить второй, который является пробелом для объединения.
Чтобы сделать все имена строчными, нам нужно исключить буквы в буквенно-цифровых цифрах, а также шаблоны 'XXX
'.
pattern_low = stringr::regex("(([A-z]){2,}[^XXX-XX-])")
data_low = gsub(pattern=pattern_low, perl = T, replacement ='\\L\\1', x=data_join)
Анализ регулярного выражения: часть ([A-z]){2,}
ищет минимум две буквы вместе, чтобы решить проблему alphanumeri c. [^XXX-XX-]
говорит ему исключить эти случаи X
s. Кроме того, мы добавляем дополнительный набор ()
вокруг всего этого, чтобы сделать его одной группой.
При замене мы используем \\L
, чтобы указать более низкое значение, и \\1
, чтобы применить его ко всему группа. Я попробовал несколько групп, как в первом случае, и это не сработало.
Теперь мы можем разбить и загрузить его в кадр данных:
# put it in a data frame
df_all = data_low %>% strsplit(split = "\\s+")
Добавление +
позволяет это обрабатывать различные пробелы.