Обратите внимание, что для текущего сценария достаточно разделить пробелами от 1+, за которыми следуют 1+ цифр до конца строки:
> separate(df, pet, into = c("Animal", "Total"), sep = "\\s+(?=[0-9]+$)")
## => Animal Total
## => 1 Dog 100
## => 2 Cat? 340
См. regex demo .
Однако, в общем случае , здесь гораздо проще использовать tidyr::extract
, поскольку нужный вам шаблон будет намного проще:
^(\D*?)\s*(\d.*)
Обратите внимание, что если в ваших строках могут быть символы новой строки, вам необходимо добавить в шаблон (?s)
, так называемый модификатор DOTALL, который позволяет .
сопоставлять символы разрыва строки в шаблоне ICU.
См. Демонстрационный пример регулярных выражений .
Сведения о регулярных выражениях
^
- начало строки (\D*?)
- Группа 1 (здесь, Animal
столбец): любые 0+ нецифровых символов, как можно меньше \s*
- 0 или более пробелов (\d.*)
- Группа 2 (здесь, столбец Total
): цифра, за которой следуют любые символы 0+ (кроме символов разрыва строки, если (?s)
не используется), максимально возможное количество (*
- жадная цифра)ntifier).
Фрагмент кода R:
library(tidyr)
df_split<-extract(df, pet, into = c("Animal", "Total"), regex="(\\D*)(\\d.*)")
df_split
# => Animal Total
# => 1 Dog 100
# => 2 Cat? 340