vlambda博客
学习文章列表

R语言学习9-读取表格数据

本次课程,我们学习R中用于读取表格数据的reader包的一些基本功能。

有关readr的详细介绍,可以参考《Mastering Software Development in R》的1.3节。

读取

在本课程中,我们将使用美国邮政编码上的一个小型数据集。该表包含有关美国人口普查局发布的城市邮政编码的百分比的信息。

首先,我们使用library()函数载入readr包。

> library(readr)

我们将读入R的文件为urban.csv.gz。这是用gzip压缩的,逗号分隔值(csv)文本文件。

urban.csv.gz数据文件所在的目录保存在一个名为datapathR对象中。
让我们使用file.path()函数构造urban.csv.gz文件的完整路径,并将其存储在名为datafile的对象中。然后使用read_csv()函数读取文件,将结果保存到urban变量。

> datafile <- file.path(datapath, 'urban.csv.gz')> urban <- read_csv(datafile)Parsed with column specification:cols( state = col_character(), zcta5 = col_double(), County = col_character(), PctUrban = col_double(), FIPS = col_character())

现在我们可以用head()函数看urban数据的前几列。

> head(urban)# A tibble: 6 x 5 state zcta5 County PctUrban FIPS  <chr> <dbl> <chr> <dbl> <chr>1 01 35004 St. Clair AL 64 011152 01 35005 Jefferson AL 79.8 010733 01 35006 Jefferson AL 0 010734 01 35007 Shelby AL 90.5 011175 01 35010 Tallapoosa AL 45.2 011236 01 35013 Blount AL 100 01009

可以看到结果有5列--state, zcta5, country, PctUrban, FIPS,并在每列列名的下方标识了数据类型。state, Country, FIPSchr类型型,而zcta5, PctUrbandbl类型。

对于第二列zcta5,现在是数字类型。如果我们想要将其变成字符型chr,应该怎么做呢?其实可以在读取的时候,就指定各列的数据类型。实现这个功能,用到的是read_csv()函数的col_types参数。具体可以查看read_csv()的帮助文档,关于col_types的解释是这样的

One of NULL, a cols() specification, or a string. See vignette("readr") for more details.

If NULL, all column types will be imputed from the first 1000 rows on the input. This is convenient (and fast), but not robust. If the imputation fails, you'll need to supply the correct types yourself.

If a column specification created by cols(), it must contain one column specification for each column. If you only want to read a subset of the columns, use cols_only().

Alternatively, you can use a compact string representation where each character represents one column: c = character, i = integer, n = number, d = double, l = logical, f = factor, D = date, T = date time, t = time, ? = guess, or _/- to skip the column.

简单来说,就是我们可以通过一串各种数据类型的简写字母组成的字符串,指定数据中各列的数据类型,甚至还可以跳过不读取某些列。

所以修改第二列的数据类型,可以这样写:

> urban <- read_csv(datafile, col_types = 'cccdc')

如果不想读取最后一列:

> urban <- read_csv(datafile, col_types = 'cccd-')> head(urban)# A tibble: 6 x 4 state zcta5 County PctUrban <chr> <chr> <chr> <dbl>1 01 35004 St. Clair AL 64 2 01 35005 Jefferson AL 79.83 01 35006 Jefferson AL 0 4 01 35007 Shelby AL 90.55 01 35010 Tallapoosa AL 45.26 01 35013 Blount AL 100

有时候我们不想读取全部的数据,比如只想读取前100行数据,应该怎么做?还是通过read_csv()函数的帮助文档,里面有一个n_max参数,可以指定读取前面多少列。

n_max Maximum number of records to read.

所以,代码如下:

> urban <- read_csv(datafile, col_types = 'cccd-', n_max = 100)

小结

展示了read_csv()2个参数:

col_types:指定各列的数据类型,也可以用来不读取指定列n_max:读取指定行数