отдельная строка символов в первой цифре с "*" в строке - PullRequest
1 голос
/ 02 октября 2019

Думаю, это легко, но я не вижу, что мне не хватает. Я хочу разбить строку по первой цифре. Прекрасно работает, пока в строке нет не буквенно-цифрового символа. Справка!

Работает:

pet<-c("Dog 100","Cat? 340")
df<-as.data.frame(pet)
df_split<-separate(df, pet, into = c("Animal", "Total"), sep = "(?<=[a-zA-Z])\\s*(?=[0-9])")

Первая строка отлично работает, но вторая строка не разбивается. Куда я иду не так?

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Обратите внимание, что для текущего сценария достаточно разделить пробелами от 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
0 голосов
/ 02 октября 2019

Мы можем использовать read.table от base R

read.table(text = sub("?", "", df$pet, fixed = TRUE), header = FALSE,
  col.names = c("Animal", "Total"))
#    Animal Total
#1    Dog   100
#2    Cat   340
...