R: parse_number терпит неудачу, если строка содержит точку - PullRequest
2 голосов
/ 20 апреля 2020

parse_number из readr завершается ошибкой, если строка символов содержит .. Хорошо работает со специальными символами.

library(readr)

#works
parse_number("%ç*%&23")

#does not work
parse_number("art. 23")

Warning: 1 parsing failure.
row col expected actual
  1  -- a number      .

[1] NA
attr(,"problems")
# A tibble: 1 x 4
    row   col expected actual
  <int> <int> <chr>    <chr> 
1     1    NA a number .

Почему это происходит?

Обновление:

Ожидаемый результат будет 23

1 Ответ

4 голосов
/ 20 апреля 2020

После точки есть пробел, который вызывает ошибку. Какое ожидаемое число из этой последовательности (0,23 или 23)?

parse_number, кажется, ищет десятичные и группирующие разделители, как определено вашей локалью, см. Документацию здесь https://www.rdocumentation.org/packages/readr/versions/1.3.1/topics/parse_number

Вы можете изменить языковой стандарт, используя следующую команду (grouping_mark - это точка с пробелом):

parse_number("art. 23",  locale=locale(grouping_mark=". ", decimal_mark=","))
Output: 23

или удалить пробел перед:

parse_number(gsub(" ", "" , "art. 23")) 
Output: 0.23 

Редактировать: Для обработки точек в качестве сокращений и чисел используйте следующее:

library(stringr)

> as.numeric(str_extract("art. 23", "\\d+\\.*\\d*"))
[1] 23
> as.numeric(str_extract("%ç*%&23", "\\d+\\.*\\d*"))
[1] 23

Выше используются регулярные выражения для идентификации числовых паттернов в строках.

  • \\d+ находит цифры
  • \\.* находит точку
  • \\d* находит остальные цифры

Примечание: Я нет экспертов по регулярным выражениям, но есть множество других ресурсов, которые сделают вас одним

...