R:如果字符串包含点,则解析_编号失败

R:如果字符串包含点,则解析_编号失败,r,readr,R,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 exp

如果字符串包含
它可以很好地处理特殊角色

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 .
库(readr)
#工作
解析_数(“%231*%&23”)
#不起作用
第23条(“第23条”)
警告:1解析失败。
行col预期实际值
1--一个数字。
[1] NA
属性(,“问题”)
#一个tibble:1 x 4
行col预期实际值
一个数字。
为什么会这样

更新:


预期结果为
23

点后有一个空格导致错误。此序列的预期数字是多少(0.23或23)

parse_number
似乎要查找由您的区域设置定义的十进制和分组分隔符,请参阅此处的文档

您可以使用以下选项更改区域设置(分组标记是带空格的点):

或删除前面的空间:

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*
    查找剩余的数字

注意:我不是正则表达式专家,但是有很多其他资源可以让你成为一个
解析数字(“第23条”)
产生
0.23
,因此周期被解释为浮点数的开始<代码>。23是格式错误的文本。
显然属于
艺术
,而
艺术。
文章
的缩写,我认为缩写在字串中很常见。我毫不怀疑人类会将那个段时间作为缩写的一部分进行解析,但是,
parse_number
似乎使用了一个正则表达式,将句点视为数字的一部分。也许该功能可以改进以处理此类情况。谢谢您的回答。在我的例子中,
用于缩写,也用作小数点。因此,更改区域设置对我的情况没有帮助。@captcoma,我已经更新了答案。我建议阅读regex/正则表达式,从字符串中解析出所需的数字
library(stringr)

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