购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.1.1 read.csv/csv2
——逗号分隔数据读取

.csv可能是目前最常见的平面文件类型了。它代表的是comma-separated values,简单来讲就是文件里每一个单独的数据值都是用逗号进行分隔的。.csv只是text file(文本文件)的一种,文本文件在微软的Windows操作系统中常以拓展名为.txt的形式呈现。文本文件可以使用各种符号来分隔数据值,例如常见的tab和“;”(分号),或者其他任意符号。即便是以.csv为拓展名的文件也并非一定是以逗号进行分隔的,相关内容在本章后面的函数演示部分会有介绍。文件的拓展名并非必须,熟悉Linux系统的读者可能接触过很多无拓展名的文件。处理无拓展名的文本文件数据时,最简单的办法就是使用data.table包中的fread函数(相关内容请参见第6章)。

utils里的read.csv/csv2是专门用于设置快速读取逗号分隔read.csv或是分号分隔read.csv2。也就是说,在事先了解数据值分隔符号的情况下,这两个函数对分隔符和其他一些参数的默认设置会使数据导入的部分更加简单和快捷。有一点需要特别注意,即这两个函数对小数点的处理:前者默认的小数点是“.”,后者默认的小数点是“,”。这只是因为不同国家技术人士对数据值分隔符的见解或者好恶不同而造成的。

万里长征第一步,我们先来者read.csv最简单的使用方式,代码如下:


> flights <- read.csv(file = "flights.csv")

此行代码可以解读为使用read.csv从工作空间读取文件flights.csv,然后将数据集保存到flights中,其他所有参数都使用默认值。因为flights.csv文件已经在R的工作路径里,所以此处免去了设置work directory。这里希望读者能够自行探索使用.rproj(R项目——将每一次数据分析的过程都看作一个独立的项目)来对每一个独立的数据分析工作进行分类和归集。该方法不仅免去了设置路径的麻烦,也减少了因原始数据文件太多而可能导致的各种坑隐患。

小知识

函数在执行的时候可以依照其默认设置的参数位置来执行,也就是说,用户无须指定每一个参数的名称,只须按照位置顺序来设定参数值即可。比如read.csv中的file参数名就可以省略,只要第一位是读取文档的目标路径和文件名就可以。

数据文件被读取到R工作环境中的第一步通常为调用str函数来对该数据对象进行初步检视,下面的代码列出了该函数最简单的使用方式。


> str(object = flights)'data.frame':   6 obs. of  6 variables:$ carrier : Factor w/ 4 levels "AA","B6","DL",..: 4 4 1 2 3 4$ flight  : int  1545 1714 1141 725 461 1696$ tailnum : Factor w/ 6 levels "N14228","N24211",..: 1 2 4 6 5 3$ origin  : Factor w/ 3 levels "EWR","JFK","LGA": 1 3 2 2 3 1$ dest    : Factor w/ 5 levels "ATL","BQN","IAH",..: 3 3 4 2 1 5$ air_time: int  227 227 160 183 116 150

str函数可用于检视读取数据结构、变量名称等。这里同样也只指定了一个非默认参数,其他参数全部都为默认值。str的输出结果由5个主要部分组成,具体说明如下。

1)data.frame代表数据集在R中的呈现格式,这里指的是数据框格式,读者可以将其设想为常见的Excel格式。

2)6 obs. of 6 variables代表这个数据集有6个变量,每个变量分别有6个观测值。

3)$ carrier与其余带有“$”符号的函数均指变量名称。

4)变量名称冒号后面的Factor和int代表的是变量类型。这里分别是指因子型Factor和整数型int数据。另外还有字符型chr、逻辑型logi、浮点型dbl(带有小数点的数字)、复杂型complex等。因子型变量的后面还列出了各个变量的因子水平,也就是拥有多少个不同的因子。比如,出发地origin后的3 levels就是表示其有3个因子水平。只是出发地是否属于因子类型的数据还有待商榷,而read.csv默认将所有的字符型数据都读成了因子型。

5)数据中的实际观测值。str函数在默认情况下会显示10行数据。使用str函数浏览导入的数据集可以让用户确定读取的数据是否正确,数据中是否有默认的部分、变量的种类等信息,进而确定下一步进行数据处理的方向。其他用来检视数据集的函数还有head、tail、view等,另外,Rstudio中的Environment部分也可以用于查看目前工作环境中的数据框或其他类型的数据集。

前文提到过,.csv并非一定是以逗号进行分隔。如果遇到以非逗号分隔数据值的情况,加之未指定分隔符例如,运行read.csv读取以Tab分隔的文件,就会出现下面的情况:


> flights1 <- read.csv(file = "flights1.csv")> str(object = flights1) 'data.frame':   6 obs. of  1 variable:$ carrier.flight.tailnum.origin.dest.air_time: Factor w/ 6 levels "AA\t1141\tN619AA\tJFK\tMIA\t160",..: 4 6 1 2 3 5[A6]

小技巧

指定(assgin)符号“<-”的快捷键是“alt”加“-”(短划线)。Rstudio快捷键参照表可以通过“alt+K”来查看详细内容。

由代码可知,read.csv函数将所有数据都读取到了一列中。因为按照默认的参数设置,函数会寻找逗号作为分隔列的标准,若找不到逗号,则只好将所有变量都放在一列中。指定分隔符参数可以解决这个问题。将\t(tab在R中的表达方式)指定给sep参数后再次运行read.csv读取以Tab分隔的csv文件,代码如下:


> flights3 <- read.csv(file = "flights1.csv", sep = "\t")> str(flights3) 'data.frame':   6 obs. of  6 variables:$ carrier : Factor w/ 4 levels "AA","B6","DL",..: 4 4 1 2 3 4$ flight  : int  1545 1714 1141 725 461 1696$ tailnum : Factor w/ 6 levels "N14228","N24211",..: 1 2 4 6 5 3$ origin  : Factor w/ 3 levels "EWR","JFK","LGA": 1 3 2 2 3 1$ dest    : Factor w/ 5 levels "ATL","BQN","IAH",..: 3 3 4 2 1 5$ air_time: int  227 227 160 183 116 150

根据实际情况不同,字符型数据有时会是因子,有时不会。如果使用read.csv默认的读取方式,那么字符型全因子化会对后续的处理分析带来很多麻烦。所以最好是将字符因子化关掉。stringsAsFactors参数就是这个开关,示例代码如下: guVg7Le287l7wrOKvuCZwkM9eZZM1x3Wwt/avaYnKx7+KlG/O4ua/2r4NSSwR8eM


> flights_str <- read.csv(file = "flightsstrings.csv", sep = "\t", stringsAsFactors = FALSE)> str(object = flights_str)'data.frame':   6 obs. of  6 variables:$ carrier : chr  "UA" "UA" "AA" "B6" ...$ flight  : int  1545 1714 1141 725 461 1696$ tailnum : chr  "N14228" "N24211" "N619AA" "N804JB" ...$ origin  : chr  "EWR" "LGA" "JFK" "JFK" ...$ dest    : chr  "IAH" "IAH" "MIA" "BQN" ...$ air_time: int  227 227 160 183 116 150

点击中间区域
呼出菜单
上一章
目录
下一章
×