
2.2 readr高效读取数据
readr包是与数据输入/输出相关的包。这个包是由Hadley Wickham等人开发的,提供了快速、友好的方式来读取矩阵数据,即.csv、.tsv等数据格式的数据。
想要使用这个包,首先需要下载这个包,可以通过如下方式进行下载:

install.packages( )函数用于下载指定包,将需要下载的包传递到这个函数,即可以下载所需要的包。
readr包中的主要函数如表2.1所示。
表2.1 readr包中的主要函数

需要注意的是,只有read_delim( )函数需要指定分隔符来读取对应分隔符的数据,其他函数只能读取指定分隔符的数据。总体来说,这些函数的使用方式相似,并有共同的参数,如表2.2所示。
表2.2 参数解释

注:n_max和skip这两个参数在只需要读取一部分数据的时候会用到。
关于readr包的优点,最重要的一点是,readr包读取数据的速度比R语言自带的读取数据函数要快很多。R语言自带的读取数据函数如表2.3所示。
表2.3 R语言自带的读取数据函数

下面比较一下readr包与R语言自带的数据读取函数,这里用到了readr包提供的数据集,这些数据集可以通过readr_example()进行查看:

readr_example( )输出了readr包所提供的数据集名称,可以看到,readr包提供了8组数据集。进一步通过readr_example( )加上对应的数据集获取数据的路径:

这样就获取到了readr包提供的数据集所在计算机中的链接,然后通过这里面的数据集来比较readr包与R自带的数据读取函数的效率。
(1)使用read.csv( )函数来读取数据所花费的时间:

代码中的system.time( )函数用于获取代码的运行时间。可以看到,read.csv( )函数读取数据的时间大约为0.01秒。
(2)使用read_csv( )函数读取数据,分析读取时间:

可以看到,read_csv( )函数读取此数据所花费的时间约为0.03秒,read_csv( )函数比read.csv( )函数稍微慢了一些。这是因为数据集太小了,体现不出两者的差异。因此,在读取小样本的时候,readr包读取数据的速度并没有优势。
下面选取一个更大的数据集来比较两者的读取速度,这个数据集来自R语言的一个绘图包ggplot所提供的diamonds数据集,这个数据集包含5万多条数据。
首先将数据集保存为.csv格式的文件,使用write_csv( )函数将数据储存下来,write_csv( )函数的第一个参数是数据集,第二个参数是数据要保存的路径。

(1)使用read.csv( )函数读取diamonds大样本数据集:

可以看到,其所花费的时间约为0.15秒。
(2)使用read_csv( )函数读取diamonds大样本数据集:

可以看到,其所花费的时间约为0.06秒,read_csv( )函数读取数据的速度比read.csv( )函数读取数据的速度快了一倍以上。数据集越大,二者之间效率的差异也就越大。
另外,需要注意的是,使用readr包读取数据,最后获取的数据格式为tibble。

tibble本质上也是数据框的结构,本质上和data.frame数据结构是一样的,但是其有比data.frame更好的使用体验。data.frame如果直接在输入框输出,则会输出所有的结果,在数据比较多的时候会造成刷屏的现象,解决方案是使用head控制输出的行数。然而,tibble数据在输出的时候会自动调用head控制输出的行数,不会刷屏。