《R数据科学实战:工具详解与案例分析 》 —1.2 readr—进阶数据读取

举报
华章计算机 发表于 2019/11/09 18:10:39 2019/11/09
【摘要】 本节书摘来自华章计算机《R数据科学实战:工具详解与案例分析》 一书中第一章,第1.2节,作者刘 健 邬书豪 。

1.2 readr—进阶数据读取

'readr'包是R语言世界级大神之一Hadley Wickham 主导开发的一个数据读取包。相较于'utils' 包里的读取函数,'readr'包主要拥有3点优势,具体如下。

1)更快。就平均读取速度而言,'readr'包里的'read_csv'一般要比'read.csv'***到十倍不等。

2)默认设置更简洁。默认情况下,'readr'包会自动解析每列的数据类型,并显示解析结果,这样可以更加直观地看到读取后的数据类型是否符合预期,而且无须设置'stringAsFactors'。

3)对数据类型的解析更准确。'utils'包中提供的'read.table'函数在甄别一列数据的属性时,只会对起始5行的观测值类型进行评估,并以此决定该列全部数据的类型。而'readr'中的函数默认评估1000行的观测值后再决定数据的类型。

'readr'包中常用的数据读取函数包括'read_delim'、'read_fwf'、'read_lines'、'read_log'和'read_table'。其中'read_delim'属于常见数据读取'read_csv/read_csv2/read_tsv'的母函数,所以也可以直接调用子函数。

read_delim

常用分隔符文件的读取函数'read_csv/read_csv2/read_tsv'分别对应于'utils'中的'read.csv/read.csv2/read.delim'。Hadley与其他成员开发的这个包更像是对'baseR'中与数据读取有关函数的一个优化,使其更加规范、稳定和可再现。表1-13中列出了read_delim参数的英文名称、功能的中文描述及部分传参注释。其中,比较重要的几个参数依次为'file''delim'(如使用'read_csv'等则无须设置)、'skip'、'col_name'和'col_types'。之所以说它们比较重要,是因为笔者发现适当调整参数设置可以让后续的数据处理事半功倍。

表1-13 数据导入函数'read_delim'参数详解

image.png

image.png

 

参数'file'的重要性不言而喻,无默认值,必须设置。第二位参数'delim'视情况可有可无,在使用具体的子函数'read_csv/read_csv2/read_tsv'时就无须设置。不过,使用母函数'read_delim'时是没有默认值的。

当一个.csv数据中前面有很多空白行时,skip参数可以直接跳过空白行来读取数据。具体设置非常简单,skip = 3即表示跳过前三行数据,从第四行开始读取。这个参数并非只用于跳过空白行,也可以用来读取原始数据的一部分,配合n_max使用可以做到随心所欲地读取任一部分数据。

另外一个重要的参数是col_names。对原始数据中的变量名称不满意,可以使用该参数自定义变量名称。这个参数可以理解为将read.table 中的参数header和col.names 的功能融合在一起,相关内容请参见1.1.3节。

变量属性对后续计算会有很大影响,所以col_types参数的重要性也不容忽视。虽然Hadley等已经将这个参数的功能优化得非常智能了,但他还是会建议用户应尽量依据个人需求来定义变量属性,因为意外总是存在的。

下面的代码展示了read_csv解析变量属性正常、读取正常的情况。运行函数之后,报告会在console中显示每一列数据都被解析成了何种属性,因此非常容易甄别哪一列数据类型不是期望的类型。在某些特殊情况下,比如原始文件分隔符号不统一的情况,这时自动解析功能会无法识别某一列或多列变量的属性,进而显示parsing failures(剖析失败)的报告。用户可以通过problems函数来查看具体的信息,从而确定原始数据中的哪一部分数据出现了问题。

    > library(readr)

    > read_csv("RawData/flights.csv")

    ## Parsed with column specification:

## cols( 

##   carrier = col_character(),

##   flight = col_integer(),

##   tailnum = col_character(),

##   origin = col_character(),

##   dest = col_character(),

##   air_time = col_integer()

## )


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。