热线电话:13121318867

登录
2018-11-04 阅读量: 902
解析数值

解析数值似乎是非常直截了当的,但以下 3 个问题增加了数值解析的复杂性。

• 世界各地的人们书写数值的方式不尽相同。例如,有些国家使用 . 来分隔实数中的整数

和小数部分,而有些国家则使用 ,。

• 数值周围经常有表示某种意义的其他字符,如 $1000 或 10%。

• 数值经常包含“分组”,以便更易读,如 1 000 000,而且世界各地用来分组的字符也不

尽相同。

为了解决第一个问题, readr 使用了“地区”这一概念,这是可以按照不同地区设置解析选

项的一个对象。在解析数值时,最重要的选项就是用来表示小数点的字符。通过创建一个

新的地区对象并设定 decimal_mark 参数,可以覆盖 . 的默认值:

parse_double("1.23")
#> [1] 1.23
parse_double("1,23", locale = locale(decimal_mark = ","))
#> [1] 1.23

readr 的默认地区是 US-centric,因为 R 是以美国为中心的(也就是说, R 基础包的文档是

用美式英语写成的)。获取默认地区设置的另一种方法是利用操作系统,但这种方法很难

奏效,更重要的是,这会让你的代码很脆弱:即使可以在你的计算机上良好运行,但通过

电子邮件分享给另一个国家的同事时,就可能失效。

parse_number() 解决了第二个问题:它可以忽略数值前后的非数值型字符。这个函数特别

适合处理货币和百分比,也可以提取嵌在文本中的数值:

parse_number("$100")
#> [1] 100
parse_number("20%")
#> [1] 20
parse_number("It cost $123.45")
#> [1] 123

组合使用 parse_number() 和地区设置可以解决最后一个问题,因为 parse_number() 可以忽

略“分组符号”:

# 适用于美国

parse_number("$123,456,789")
#> [1] 1.23e+08

# 适用于多数欧洲国家

parse_number(
"123.456.789",
locale = locale(grouping_mark = ".")
)
#> [1] 1.23e+08
# 适用于瑞士
parse_number(
"123'456'789",
locale = locale(grouping_mark = "'")
)
#> [1] 1.23e+08
0.0000
3
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子