【问题标题】:R: parse_number fails if the string contains a dotR:如果字符串包含点,则 parse_number 失败
【发布时间】:2020-04-20 17:23:06
【问题描述】:

如果字符串包含.,则来自readrparse_number 失败 它适用于特殊字符。

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

【问题讨论】:

  • parse_number("art.23") 产生0.23 因此句点被解释为浮点数的开始。 . 23 是一个格式错误的文字。
  • . 明显属于art,而art.article的缩写,我认为缩写在字符串中很常见
  • 我不怀疑人类会将该句点解析为缩写的一部分,但parse_number 似乎使用了一个将句点视为数字的一部分的正则表达式。也许可以改进该功能以处理此类情况。

标签: r readr


【解决方案1】:

点后有一个空格导致错误。这个序列的预期数字是多少(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* 查找剩余数字

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

【讨论】:

  • 感谢您的回答。在我的例子中,. 用于缩写,也用作小数点。因此,更改语言环境对我来说无济于事。
  • @captcoma,我已经更新了我的答案。我建议阅读正则表达式/正则表达式以从字符串中解析出您需要的数字
猜你喜欢
  • 1970-01-01
  • 2019-06-07
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 2019-03-15
相关资源
最近更新 更多