第 3 章 数据导入与导出

3.1 路径操作

获取工作路径,用getwd(),设置工作路径,用setwd()

3.2 导出

3.2.1 保存结果

如果我们希望保存一些变量,供下次用R语言继续分析,则一般讲数据保存为rda数据或RData数据,rda为RData的缩写,两种数据完全等同。保存单个变量或一些变量,用save函数,其基本用法为save(..., list = character(),file = stop("'file' must be specified"))。…为变量名,可以是1个,也可以是多个,file为文件名,不指定路径的条件下,默认保存在工作路径中,当然也可以指定路径。

也可以不通过变量名,而通过变量名的字符串来保存,这时将字符串赋给参数list,这在存储多个变量,且变量名有规律时是有用的(因为可以用编程的方法给出这些变量名的字符串)。下面是一个例子:

# 通过变量名来保存
# 数据生成
name <- c("Alice","Bob","Christien","Einstein")
age <- c(10,20,14,25)
gender <- c("F","M","F","M")
weight <- c(25,50,30,54)
nationality <- c("USA","UK","China","German")
height <- c(1.2,1.65,1.43,1.75)
example_df <- data.frame(name,age,gender,weight,nationality,height)
# 保存
save(example_df,name,file = "example_data.rda")

# 通过变量名的字符串来保存
# 数据生成
x1 <- 1
x2 <- 1:2
x3 <- 1:3
x4 <- 1:4
# 保存
dataname <- paste0("x",1:4)
save(list = dataname, file = "example_x.RData")

在运行完以上代码之后,你将在工作路径中找到一个example_data.rda文件和一个example_x.RData文件。我们会在导入部分讲解如何导入这些数据。

如果想保存整个环境,用save.image函数。常用用法为save.image(file = ".RData"),用file指定文件名即可。

3.2.2 导出表格数据为csv或txt

将数据框导出csv文件用函数write.csv,导出txt文件用write.table。write.table用法为如下,write.csv与此相似。

write.table(x, file = "", append = FALSE, quote = TRUE, sep = " ",
            eol = "\n", na = "NA", dec = ".", row.names = TRUE,
            col.names = TRUE, qmethod = c("escape", "double"),
            fileEncoding = "")

在导出的txt文件中,字符串型数据将用引号括起来,如果不想有引号,可设置quote = FALSE。注意导出的csv文件中也是如此,只是如果用Excel打开的话,其中的引号不显示出来,如果用文本查看器如Notepad++打开,就可以看到引号。如果要保存的数据不是数据框格式,会被转化为数据框格式,然后再保存为csv或txt文件。导出文件中默认包含行名(行序号)和列名,如果不需要,在write.table中可以设定row.names = FALSE及col.names = FALSE,在write.csv中设定row.names=FALSE(在write.csv中,可以通过col.names给csv文件修改列名,但是不能取消其列名)。更多参数设置,可查看write.table的帮助文档。在write.csv中,会将行名与列名交叉格以空字符串输出,但write.table会将其空缺。这会导致他们重新导入时,对行名的处理不同。下面是一些例子:

# 数据生成
name <- c("Alice","Bob","Christien","Einstein")
age <- c(10,20,14,25)
gender <- c("F","M","F","M")
weight <- c(25,50,30,54)
nationality <- c("USA","UK","China","German")
height <- c(1.2,1.65,1.43,1.75)
example_df <- data.frame(name,age,gender,weight,nationality,height)
# 保存
write.csv(example_df, file = "example_df.csv")
write.table(example_df, file = "example_df.txt")
write.table(example_df, file = "example_df2.txt",quote = FALSE)

3.2.3 保存图片

如果你不需要图形展示出来,需要其直接保存,可以用下面的方式:首先新建一个图片保存格式(称之为一个图形设备),如png、jpg、pdf(pdf是矢量图),然后给出绘图相关的代码,最后将图形设备关闭。下面是一个简单的例子。其中的png可以换成jpg、pdf等。在这种方式中,可以设置图片的长、宽、分辨率等参数,相关设置可参考png等的帮助文档。

png("example_plot.png") # 新建一个图片保存格式
plot(1:10) # 绘图
dev.off() # 关闭图形设备
## png 
##   2

如果你首先绘出了图形,然后需要将你所看到的图形保存,则可用dev.copy函数,后接dev.off()。如果你使用RStudio,可以利用Plots窗口中的Export按钮。下面是一个代码执行的例子:

plot(1:10,type = "l")

dev.copy(png, 'example_plot2.png')
## png 
##   3
dev.off()
## png 
##   2

如果最开始打开的是Windows窗口,则可用savePlot函数,其用法为:

savePlot(filename="Rplot",
         type=c("wmf", "png", "jpeg", "jpg", "bmp", "ps"),
         device=dev.cur())

下面为一个例子:

windows(width = 9, height = 9, rescale = "fit")  # 打开一个Windows窗口
plot(1:10,type = "l")
savePlot(filename="Myplot",type="pdf")
# savePlot(filename="Myplot",type="png")
## 支持下列格式:"wmf", "emf", "png", "jpg", "jpeg", "bmp", "tif", "tiff", "ps", "eps", "pdf"
dev.off()

关于图形设备管理,这里给出了很好的讲解: https://stackoverflow.com/questions/23621012/display-and-save-the-plot-simultaneously-in-r-rstudio

3.2.4 导出文本

可以用readr::write_file、writeLines、cat或writeChar,示例如下:

library("readr")
txt <- "This is a piece of text with 中文

and 
Multi-lines"
write_file(txt, "write_file.txt", append = FALSE)

fileConn<-file("writeLines.txt")
writeLines(txt, con = fileConn,sep = "")
close(fileConn)

sink("cat.txt")
cat(txt)
## This is a piece of text with 中文
## 
## and 
## Multi-lines
sink()

fileConn<-file("writeChar.txt")
writeChar(txt, con = fileConn, eos = NULL, useBytes = FALSE)
close(fileConn)

部分函数运行在Windows系统下,其结果在某些文本编辑器中可能会多出空行、少出空行,中文出现乱码的情况,可以更换其他函数、系统或编辑器试试。

3.2.5 与Python通用的feather数据

当我们希望将数据给一个Python用户使用时,rdata格式是无法被Python读取的,而存为csv或txt又可能占用过大存储空间。feather数据为R与Python都可以读写数据框的二进制数据存储格式,他的用法如下:

# in R
library(feather)
path <- "my_data.feather"
write_feather(df, path)
df <- read_feather(path)
# in Python
import feather
path = 'my_data.feather'
feather.write_dataframe(df, path)
df = feather.read_dataframe(path)

3.3 导入

3.3.1 数据载入

将之前的rda数据或RData数据载入,只需用函数load。如果想导入多个rda或RData(包括一个文件夹下的所有rda或RData数据),需要用循环或其他方式进行,总之没有现成的函数。避免这个麻烦的最好方法是,一开始保存数据的时候,就将不同变量保存为1个rda或RData文件。

load("example_data.rda")
load("example_x.RData")

3.3.2 表格数据(csv、txt、data等文件)的导入

csv文件是数据分析中用的最多的数据源之一,其数据之间用逗号分隔,类似的还有txt、data文件格式,他们都是用某一特殊符号分隔的文本文件。(拓展的)基础包中通过函数read.table、read.csv、read.csv2等函数导入这些数据,导入结果均以数据框格式存储。他们的区别主要在于默认的分隔符不同,read.csv中默认的分隔符为逗号,,read.table中默认的分隔符为空格,read.csv2中默认的分隔符为分号;,也可以改变默认的分隔符,因而这几个函数之间可以相互替代使用。以read.csv为例,其用法为read.csv(file, header = TRUE, sep = ",", quote = "\"",dec = ".", fill = TRUE, comment.char = "", ...)。file为文件名,为字符串格式,如果不在工作路径中,则需要写出整个路径。header表示文件中是否包含表头(列名),如果不包含,将其设为FALSE。sep为分隔符,默认为逗号,也可以根据实际情况修改。

example_df_load_csv <- read.csv("example_df.csv")
example_df_load_txt <- read.table("example_df.txt")
example_df2_load_txt <- read.table("example_df2.txt")

3.3.3 按行或单元导入(表格数据)

按行导入用readLines,按单元导入用scan

3.3.4 读取文本

整体读取可用readr::read_file,按行读取可用readLines,如

txt_write_file <- read_file("write_file.txt")
txt_write_file
## [1] "This is a piece of text with <d6><d0><ce><c4>\n\nand \nMulti-lines"
txt_writeLines <- read_file("writeLines.txt")
txt_writeLines
## [1] "This is a piece of text with <d6><d0><ce><c4>\r\n\r\nand \r\nMulti-lines"
txt_cat <- read_file("cat.txt")
txt_cat
## [1] ""
txt_writeChar <- read_file("writeChar.txt")
txt_writeChar
## [1] "This is a piece of text with <d6><d0><ce><c4>\n\nand \nMulti-lines"
identical(txt_write_file,txt_writeChar)
## [1] TRUE
identical(txt_writeLines,txt_cat)
## [1] FALSE
identical(txt_write_file,txt_writeLines)
## [1] FALSE
identical(txt_write_file,txt)
## [1] FALSE
identical(txt_writeLines,txt)
## [1] FALSE
txt_write_file2 <- readLines("write_file.txt")
## Warning in readLines("write_file.txt"): incomplete final line found on
## 'write_file.txt'

当仅含ASCII码时,整体读取也可以用readChar

some_text <- readChar("some_text.txt", nchars=file.info("some_text.txt")$size)