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
0
3
关注作者
收藏
评论(0)
发表评论
暂无数据
推荐帖子
0条评论
0条评论
1条评论