R:如果字符串包含点,则 parse_number 失败

cap*_*oma 3 r readr

parse_numberreadr如果字符串包含 a 则from失败. 它适用于特殊字符。

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 .
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

更新:

预期的结果是 23

Jam*_*e_B 5

点后面有一个空格导致错误。这个序列的预期数字是多少(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
Run Code Online (Sandbox Code Playgroud)

或删除前面的空间:

parse_number(gsub(" ", "" , "art. 23")) 
Output: 0.23 
Run Code Online (Sandbox Code Playgroud)

编辑:要将点作为缩写和数字处理,请使用以下内容:

library(stringr)

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

以上使用正则表达式来识别字符串中的数字模式。

  • \\d+ 找到一个数字
  • \\.* 找到一个点
  • \\d* 找到剩余的数字

注意:我不是正则表达式方面的专家,但还有很多其他资源可以让您成为