【上一篇:31.readr包里read系列函数的全部参数解析】
【下一篇:33.关于parse系列函数之解析字符串】
parse系列函数接受一个字符向量,并返回一个更专门化的向量,如逻辑、整数或日期。
学习这些函数是为了更好地理解后面readr是如何解析文件的。
有八个特别重要的解析函数:parse_logical()和parse_integer()、parse_double()、parse_double()、parse_factor()、parse_factor()和parse_factor()和parse_time()。
这些函数的参数列表是很相同的:na指定将哪些字符解析成缺失值;locale进行区域设置,默认以美国为中心,也使用locale()创建自己的地区,控制诸如默认时区、编码、小数点、大标记和日/月名称等内容;trim_ws默认去掉字符前后的空白符。
parse_logical(x, na = c("", "NA"), locale = default_locale(), trim_ws = TRUE)
parse_integer(x, na = c("", "NA"), locale = default_locale(), trim_ws = TRUE)
parse_double(x, na = c("", "NA"), locale = default_locale(), trim_ws = TRUE)
parse_number(x, na = c("", "NA"), locale = default_locale(), trim_ws = TRUE)
parse_character(x, na = c("", "NA"), locale = default_locale(), trim_ws = TRUE)
第一部分是解析数字。
关于数字,有三个主要的问题:
1)世界上不同地区的人写数字的方式是不一样的,例如有些国家的人用“.”(点)表示小数点,有的则用“,”(逗号)。解决方法是readr的locale概念。
> parse_double("1.23")
[1] 1.23
# 通过设置locale函数的decimal_mark参数实现
> parse_double("1,23", locale = locale(decimal_mark = ","))
[1] 1.23
2)数字上下文有其他的字符,例如“$1000”、“10%”。用parse_number()函数解决这个问题,这个函数会忽略数字前后的非数字字符,对货币和百分百特别有用,还可以用来提取嵌入文本中的数字。
> parse_number("$100")
[1] 100
> parse_number("20%")
[1] 20
> parse_number("It cost $123.45")
[1] 123.45
3)为了便于阅读,会在数字之间加上分组字符,有的国家是用逗号,例如1,000,000,000(美国),有的国家使用单引号,例如1'000'000'000(瑞士),有的国家使用点,例如1.000.000.000(欧洲)。可以用parse_number()的locale参数解决。parse_number()函数默认:数字内部忽略区域设置指定的分组标记。
# parse_number()函数默认忽略分组标记
> parse_number("$123,456,789")
[1] 123456789
# 默认以美国为中心,所以逗号解析为分组符号,默认被忽略,点是小数点,
> parse_number("1,234.56")
[1] 1234.56
# 欧洲
> parse_number("123.456.789", locale = locale(grouping_mark = "."))
[1] 123456789
# 瑞士
> parse_number("123'456'789", locale = locale(grouping_mark = "'"))
[1] 123456789
总结:书中将parse_double()和parse_number()放在一起讲。parse_double()是比较严格的解析函数,parse_number()比较灵活。
网友评论