- R数据科学实战:工具详解与案例分析
- 刘健 邬书豪
- 1098字
- 2023-07-18 17:12:10
1.2 readr——进阶数据读取
'eadr'包是R语言世界级大神之一Hadley Wickham主导开发的一个数据读取包。相较于'utils'包里的读取函数,'readr'包主要拥有三点优势,具体如下。
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中列出了readr_delim包参数的英文名称、功能的中文描述及部分传参注释。其中,比较重要的几个参数依次为'file'它们比较'delim'(如使用'read_csv'等则无须设置)、'skip'、'col_name'和'col_types'。之所以说它们比较重要,是因为笔者发现适当调整参数设置可以让后续的数据处理事半功倍。
表1-13 数据导入函数'read_delim'参数详解
参数'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() ## )