1.4.4 数据的导入导出
1.数据文件的导入与导出
我们常用外部保存的数据文件来绘制图表。此时,就需要借助可以导入数据的函数导入不同格式的数据,包括CSV、TXT,以及Excel、SQL、HTML等数据文件。有时候,我们也需要将处理好的数据从R语言中导出保存。其中,我们在数据可视化中使用最多的就是前3种格式的数据文件。
(1)CSV格式数据的导入与导出
使用read.csv()函数,可以导入CSV格式的数据,并存储为数据框形式。需要注意是:当stringsAsFactors=TRUE时,R会自动将读入的字符型变量转换成因子,但是这样很容易导致数据只按默认字母顺序展示。在导入大批量数据时,为了提高性能,尽可能分两步走:
①显式指定“stringsAsFactors = FALSE”;
②依次将所需要的数据列(向量)转换为因子。
mydata<-read.csv("Data.csv", sep=", ", na.strings="NA", stringsAsFactors=FALSE)
使用write.csv()函数,可以将data.frame的数据存储为CSV文件
write.csv(mydata, file = "File.csv")
CSV文件主要有以下3个特点。
①文件结构简单,基本上和TXT文本的差别不大;
②可以和Excel进行转换,这是一个很大的优点,很容易进行查看模式转换,但是其文件的存储大小比Excel小。
③由于其简单的存储方式,一方面可以减少存储信息的容量,这样有利于网络传输以及客户端的再处理;另一方面,由于是一堆没有任何说明的数据,其具备基本的安全性。所以相比TXT和Excel数据文件,我们更加推荐使用CSV格式的数据文件进行导入与导出操作。
(2)TXT格式数据的导入与导出
使用read.table()函数不仅可以导入CSV格式的文件数据,还可以导入TXT格式的文件数据,并存储为数据框数据。
mydata<-read.table("Data.txt", header = TRUE)
使用write.table()函数可以将data.frame的数据存储为CSV文件:
write.table(mydata, file = "File.txt")
(3)Excel格式数据的导入与导出
使用xlsx包的read.xlsx()函数和read.xlsx2()函数可以导入XLSX格式的数据文件。但是更推荐使用CSV格式导入数据文件。
mydata<- read.xlsx("Data.xlsx", sheetIndex=1)
也可以使用write.xlsx()函将数据文件导出为XLSX格式:
write.xlsx(mydata, "Data.xlsx", sheetName="Sheet Name")
需要注意的是:使用R ggplot2绘图时,通常使用一维数据列表的数据框。但是如果有时候导入的数据表格是二维数据列表,那么我们需要使用reshape2包的melt()函数或者tidyr包的gather()函数,可以将二维数据列表的数据框转换成一维数据列表。
一维数据列表和二维数据列表的区别
一维数据列表就是由字段和记录组成的表格。一般来说字段在首行,下面每一行是一条记录。一维数据列表通常可以作为数据分析的数据源,每一行代表完整的一条数据记录,所以可以很方便地进行数据的录入、更新、查询、匹配等,如图1-4-3所示。
图1-4-3 一维数据列表
二维数据列表就是行和列都有字段,它们相交的位置是数值的表格。这类表格一般是由分类汇总得来的,既有分类,又有汇总,所以是通过一维数据列表加工处理过的,通常用于呈现展示,如图1-4-4所示。
图1-4-4 二维数据列表
一维数据列表也常被称为流水线表格,它和二维数据列表做出的数据透视表最大的区别在于“行总计”。判断数据是一维数据列表还是二维数据列表的一个最简单的办法,就是看其列的内容:每一列是否是一个独立的参数。如果每一列都是独立的参数那就是一维数据列表,如果每一列都是同类参数那就是二维数据列表。
注意为了后期更好地创建各种类型的数据透视表,建议用户在数据录入时,采用一维数据列表形式的进行数据录入,避免采用二维数据列表的形式对数据进行录入。
2.缺失值的处理
有时候,我们导入的数据存在缺失值。另外,在统计与计算中,缺失值也起着至关重要的作用。R语言中主要有两种类型的缺失数据:NA和NULL。
(1)NA
在R中,使用NA代替缺失数据作为向量中的另外一种元素出现。我们可以使用is.na()函数来检查向量或数据框中的每个元素是否缺失数据。我们先构造一个含有缺失数据的数据框,然后讲解使用tidyr包实现常用的缺失数据的处理方法,如表1-4-4所示。
表1-4-4 缺失值的处理
(2)NULL
NULL就是没有任何东西,表示数据的空白,而并非数据的缺失,也不能成为向量或者数据框的一部分。在函数中,参数有可能是NULL,返回的结果也可能是NULL。我们可以使用is.null()函数判定变量是否为NULL。