1.4 readr

readr提供了一种快速友好的方式读取矩形数据3(如:csv,tsv,fwf),且当读取大型数据集时默认有进度条显示。

如果对readr包不熟悉,可以直接阅读包作者大神Hadley Wickham的书R for data science 中data import chapter章节。

1.4.1 安装

直接安装tidyverse获取或单独安装readr。

# The easiest way to get readr is to install the whole tidyverse:
install.packages("tidyverse")

# Alternatively, install just readr:
install.packages("readr")

# Or the the development version from GitHub:
# install.packages("devtools")
devtools::install_github("tidyverse/readr")

1.4.2 用法

readr包是tidyverse系列的核心包,可以加载tidyverse使用。

library(tidyverse)

1.4.2.1 主要函数

readr支持七种read_功能的文件格式。

read_csv():逗号分隔符文件 - read_tsv():制表符分割文件 - read_delim():规定分隔符文件 - read_fwf():固定宽度文件 - read_table():表格文件,列间用空格隔开 - read_log():Web日志文件

在大多数情况下,我们常使用read_csv(),提供文件路径,将得到数据表。示例如下:

mtcars <- read_csv(readr_example("mtcars.csv"))

通过上述输出反馈,我们可以知道读进去的数据集每列类型。如果发现不对可以通过col_types参数修改。大多数情况下,我们并不需要指定列的类型,readr会自动猜测列类型。

mtcars <- read_csv(readr_example("mtcars.csv"), col_types = 
  cols(
    mpg = col_double(),
    cyl = col_integer(),
    disp = col_double(),
    hp = col_integer(),
    drat = col_double(),
    vs = col_integer(),
    wt = col_double(),
    qsec = col_double(),
    am = col_integer(),
    gear = col_integer(),
    carb = col_integer()
  )
)

1.4.2.2 参数

read_csv()的参数如下:

read_csv(
  file,
  col_names = TRUE,
  col_types = NULL,
  locale = default_locale(),
  na = c("", "NA"),
  quoted_na = TRUE,
  quote = "\"",
  comment = "",
  trim_ws = TRUE,
  skip = 0,
  n_max = Inf,
  guess_max = min(1000, n_max),
  progress = show_progress(),
  skip_empty_rows = TRUE
)

col_types :指定列类型,可用项如下所示(含简写): c = character,i = integer,n = number,d = double,l = logical,f = factor,D = date,T = date time,t = time,默认值为guess.

locale:locale参数是readr中很重要的一个参数,指定日期使用的月和日的名称,时区,字符编码,日期格式,数字的小数和点位数和分隔符。

locale()的第一个参数是date_names,控制月份和日期的名称,指定最简单的方式ISO 639 language code

locale('zh') # 中文
locale('ja') #日本
locale('ko') #韩国

编码和时区问题是我们常面临的问题。

read_csv(readr_example("mtcars.csv"),locale = locale(encoding = 'UTF-8',tz = 'Asia/Shanghai'))

详细信息查看手册vignette("locales")

1.4.3 导出功能

由于系统不同的缘故,在win系统下可能面临编码问题。我用readr导出数据时一般采用write_excel_csv()功能导出。

需要说明的是write_系列函数可以将输出文件压缩。

data(storms, package = "dplyr")
write_csv(storms, "storms.csv")
write_csv(storms, "storms.csv.gz")

1.4.4 总结

大部分情况下,当数据整洁时且不涉及时间(日期不影响)时,采用默认参数读取数据即可。

当数据集前面行缺失值较多,readr自动猜数据列类型错误时,需要我们人为指定列类型;当编码时区等错误时,需指定locale();以上是可能遇到的问题以及解决办法。


  1. 矩形数据英文中表示为 rectangular data,矩形数据每一列都是变量(特征),而每一行都是案例或记录,关系数据库中的单表就是矩形数据的一种。↩︎