2.2.1 结构化数据读入
本章2.1节介绍了R中各种各样的数据结构,下面介绍如何将数据读入R中。分两个部分分别讲解R中的数据可以从哪两种渠道获得,常用的txt,csv,xls文件里,数据又该如何一键导入R中。
1.创建
数据的第一个来源就是自己创建。尽管这种方法不常用,但还是需要掌握,可以作为辅助。创建数据最重要的就是明确自己需要生成的数据结构及数据类型。前面已经针对每种结构的数据的生成方法做了详细介绍,包括向量(c( )),矩阵(matrix( )),数据框(data.frame( ))和列表(list( ))这四种基本结构。
2.读入
R可以从很多常用的统计软件中导入数据,比如Minitab,SAS,Stata,Sql里的数据都可以导入。这里以最常见的三种数据格式——txt,csv 和xls(xlsx)为例来详细说明。
(1) txt。很多时候,我们手里会拿到一个文本文件(后缀名为.txt),如图2-9所示。
对于文本文件,用命令read.table( )就可以将其数据对象顺利导入,具体使用的语法是:read.table file_ name header=logical_ value sep="" ,其中,file_name表示文件名; header用于设置是否把数据的第一行识别为变量名; sep则用来指定文件中的分隔符。如果把图2-9中的电影数据集以txt格式保存之后,使用命令read.table( )就可以得到如下结果:
非常简单的操作,但要注意,比如你从狗熊会微信公众号下载了数据,输入命令,却出现了以下结果:
明明下载了文件,但R显示没有这个文件。其实这里缺少了“设定路径”。当你把数据下载下来时,你的数据在哪里?下载文件夹里?但是R读入它时,并不知道这个数据文件具体下载到了哪里。这时有两种解决方法:第一种是清楚地告诉R,数据文件存储在哪里,即输入要读取的数据文件的完整路径(也就是存储文件的位置)。
第二种方法是找到下载的数据文件,将其拷贝到工作目录(working directory)。当我们打开一个R文件时,它就会自动设定一个工作目录(其实就是一个文件夹),在这个工作目录下面读写文件最方便,只需输入完整的文件名即可。默认情况下,工作目录是R软件的安装路径,当然也可以通过setwd( )更改工作的文件夹。在实际应用中,通常的做法是先把R的工作目录设定在某个文件夹内,再把要用到的数据文件都放入其中,以方便读写。
比如,首先可以用getwd( )获取R语言的工作目录(这里显示的工作目录在一个叫bear_read的文件夹中),这样把数据movie.txt放入该文件夹时,就不需要再输入长长的路径,直接用文件名读入即可。
(2)csv。第二种常见的数据文件格式是csv,打开如图2-10所示。
csv的全称是comma separated values,它是一种用逗号分隔的文件,其跨平台支持性能很好,大部分的数据软件都可以对它直接处理。严格来说,csv是一种文本文件。图2-11是用文本编辑器打开的movie数据集,显示除了用文本编辑器打开文件时非常凌乱外,它的每个数据列都使用逗号分隔开,而且是半角逗号(就是英文的逗号)。
弄清楚一个文件包含什么分隔符有什么用呢?我们最终想读出来的是一个整整齐齐、横行竖列的数据框,但文本却是以一行一行的形式呈现的,因此就要告诉计算机,这个文件中列与列之间是如何划分的,也就是分隔符是什么。这也正是命令read.table( )的参数sep要设置的内容。函数read.table( )中的sep,默认选项是空格。如果想用read.table( )读取csv文件,该如何设置分隔符呢?如果不设置,读入的数据将是什么样呢?如下所示:
其实读入csv,一般不常用read.table( ),而是用专有函数read.csv( ),前面的介绍主要是为了详细阐释分隔符的含义。如果使用read.table( )前拿到的是十分工整且正好以空格分隔的文件,那么万事大吉,但如果稍遇到不规整的数据用了比较奇特的符号分隔,那么不仔细观察并特别设置这个参数就会出现问题。
下面正式介绍函数read.csv( )的使用。它的用法与read.table( )类似,也是read.csv("file_ name" header=logical_ value)。其实,它就是为csv这种数据格式量身定做的。首先无须特别设定分隔符;其次它的参数header的默认值就是TRUE(read.table的参数header的默认值是FALSE),这也完美契合了大部分实际数据的数据格式。
此外,read.csv( )中还有很多有趣的参数,通过翻阅帮助文档就可一探究竟。有时当按照常规读入却报错时,往往设置一个参数就可以解决,比如本书1.3节中介绍过文件的编码问题,可通过设定参数fileEncoding解决;再如,发现无法对文字运用文本函数时,可能是读入时R默认把它变成了factor,需要通过设置stringsAsFactors参数解决等,这些都是比较常见的问题。
(3) xls(xlsx)。 xls(xlsx)是Excel中的“原生态”表格数据格式。这可能是R初学者最关注的形式了,它的打开与csv文件界面类似(见图2-12)。
虽然常用,但在R里我们并不经常直接读取xls(xlsx)文件,不仅因为在基础base包里没有可以对它直接处理的函数,也因为xls(xlsx)这种数据格式并不如csv的跨平台兼容性好。推荐的做法是将其另存为csv格式,然后按照读取csv的方法读取。
当然,如果想直接读取xls(xlsx)文件也不是没有办法。 2016年,Hadley Wickham(见图2-13)就发布了一个读取Excel数据的新包readxl。
该包中的函数read_excel( )即可读取一个xls或者xlsx表格中的某个sheet,具体用法如下: