在之前的几章中,我们详细介绍了R语言、Rtools、Rstudio以及R包的安装,解决新手最先碰到的两大难题!

大家学习R语言肯定是为了处理自己的数据,不是为了使用R自带的数据练手。所以这一章就给大家演示:如何把数据读入R语言?如何把数据另存为其他格式?

结合上一章的内容,本章内容其实就是选择合适的函数对数据进行读写操作。

大家在日常生活中遇到的最多的数据应该还是Excel数据,但是对于R语言来说,我们必须要把外部数据读入到R里面,才能进行各种操作。对于我们使用R语言处理之后的数据,可能还需要再保存为excel格式。

这两个问题对于会的人来说非常简单,可以有多种方法可以实现,但是对于新手来说却经常遇到报错。今天从一个新手的角度说一说R语言的数据读取和另存问题

工作路径

首先说下工作路径的问题,当前工作目录(working-directory)是你的R语言读取和保存文件的默认位置。

如果你没改过的话,这个位置有一个默认值,在第2章介绍过:点击Tools-Global Options,按照以下图片所示进行设置,方框里的就是默认的工作目录。

https://mmbiz.qpic.cn/mmbiz_png/tpAC6lR84R8Bd79xC88eibtve4h15CflNWLx3mXH0KMIictpS8sL7Kq7152777ut9ceqAnWN3I3gvb7WIicnIyiaGg/640?wx_fmt=png&from=appmsg

确定好你的R语言的工作目录以及你的文件的存放位置后,才能顺利读取文件,比如你的工作目录在D盘,但是你的文件在E盘,如果读取时没有明确指定文件位置,就会报错。

打开RStudio后,可以使用getwd()查看当前工作目录:

getwd()

以上结果说明我在:F盘-R_books-R_beginners这个文件夹里。

也可以查看Console(控制台)的左上角获取当前的工作目录:

https://mmbiz.qpic.cn/mmbiz_png/tpAC6lR84R8Bd79xC88eibtve4h15CflNU1f6v3gOSmnCxzULiavRicaXhCJPE7e2dJHAHibFSSpMpbC7Nh1iadlNxQ/640?wx_fmt=png&from=appmsg

可以使用setwd()重新设置当前工作目录:

# 设置为F盘R_books文件夹
setwd("F:/R_books/")

注意,在R中写路径时需要使用斜杠/,而不是反斜杠\,如果你要在路径中使用反斜杠,必须用两个\\,比如:F:/R_books/F:\\R_books\\都是正确的,但是F:\R_books\是错误的。

确认当前工作目录是非常重要的,尤其是在读取或者保存文件的时候,你总得知道你目前在哪个文件夹吧?

以下是一些用于管理R工作路径的函数:

https://mmbiz.qpic.cn/mmbiz_png/tpAC6lR84R8Bd79xC88eibtve4h15CflN5HUPHT75JltfAuIZtDEck4VZR0AyVuDFiaGfxdtlg26kjTeXtJzzoTQ/640?wx_fmt=png&from=appmsg

除此之外还有一些可以和当前工作目录交互的函数,比如列出当前工作目录下的所有文件和文件夹:

list.files()

# 类似的函数还有dir()

还可以只列出符合要求的文件,比如列出所有以qmd结尾的文件:

list.files(pattern = "qmd$") # 涉及正则表达式

读取文件

不同文件有不同的后缀名,Windows系统可更改是否显示后缀名(一般推荐显示后缀名,方便判断到底是哪种类型的文件):

https://mmbiz.qpic.cn/mmbiz_png/tpAC6lR84R8Bd79xC88eibtve4h15CflNFjQzr1iaEbrJjzpmP8vicFpJZ5plxiaZeTX942yicSopzFImlR0qzrISwQ/640?wx_fmt=png&from=appmsg

不同的后缀名说明文件是不同的格式,不同的格式需要不同的软件(函数)才能打开,乱用就会导致打不开或者打开乱码。

Excel

这个格式太常见了,大家日常生活用的大部分都是这种格式。

比如有这么一个excel文件:brca_clin.xlsx,这个数据是我从TCGA官网下载的乳腺癌患者的临床信息,包含:患者ID、样本ID、样本类型(normal还是tumor?)、年龄、性别等。

它里面的内容是这样的:

https://mmbiz.qpic.cn/mmbiz_png/tpAC6lR84R8Bd79xC88eibtve4h15CflNxmFJVpnyeXlX0hjB6zuel1H1BkIDfMyneXm9HKUGway9YaIQHcPlzQ/640?wx_fmt=png&from=appmsg

示例excel

现在我们需要把它读入R里面。

我推荐你使用readxl包读取Excel文件。这个R包并不是“出厂自带”的,因此我们需要先安装这个R包(提醒:你更改镜像了吗?):

install.packages("readxl")

安装好之后,我们需要加载这个R包才能使用:

library(readxl)

然后我们就可以读取这个文件了,**读取时,你必须指明你的文件在哪里!**这就涉及到工作路径的问题了,如果你的文件和当前工作路径不在同一个文件夹下,那么一定要指定你的文件在哪里。如果文件路径没写对,就会出现下面这种类似的报错,一般情况下,它会告诉你:你的路径没写对、或者找不到这个文件、这个文件不存在、不能打开连接等等错误。

# col_names = TRUE 表示这个文件是有列名的
brca_clin <- read_xlsx("E:/brca_clin.xlsx", col_names = TRUE)

Error: `path` does not exist:E:/brca_clin.xlsx

这个时候你就要去确认下,你的这个brca_clin.xlsx文件到底在哪里!当你给它正确的路径时,它就不会报错。比如这个示例文件位于F盘-R_books文件夹-R_beginners文件夹中,你写对了就能读进来:

# 读取
brca_clin <- read_xlsx("F:/R_books/R_beginners/brca_clin.xlsx", col_names = T)

brca_clin[1:5,2:5] # 查看第1-5行,第2-5列

这样我们就成功把文件读取到R里面了,并且这个文件的内容被存储在brca_clin这个对象(object)中,此时你可以在Environment面板中看到brca_clin这个对象。

上面代码中的F:/R_books/R_beginners/brca_clin.xlsx这种路径写法被称为绝对路径,意思是:从最开始的位置一直往下写,除此之外,还有一种写法是相对路径,即从相对于当前路径的位置开始写。

比如,我这段脚本的当前工作路径位于F盘-R_books文件夹-R_beginners文件夹中(还记得怎么查看当前工作路径吗?getwd()),和brca_clin.xlsx这个文件同处于一个文件夹中,那么在读取时也可以这么写:

# 因为在同一路径下,所以可以直接写名字
brca_clin <- read_xlsx("brca_clin.xlsx", col_names = T)

# 或者
brca_clin <- read_xlsx("./brca_clin.xlsx", col_names = T)

其中的./表示当前工作路径,可以省略不写。

如果一个名字是brca_expr.xlsx的文件位于F盘-R_books文件夹-R_beginners文件夹-datasets文件夹中,也就是说datasets这个文件夹是和当前工作路径同一级的,但是我们要读取的文件在datasets文件夹中,那么在读取时就可以这么写:

# 加了一个datasets/
brca_expr <- read_xlsx("datasets/brca_expr.xlsx", col_names = T)

如果一个名字是brca_expr_不要删.xlsx的文件位于F盘-R_books文件夹中,也就是说位于当前工作路径的上一级文件夹中,如果要读取这个文件,可以使用以下代码:

brca_expr_不要删 <- read_xlsx("../brca_expr_不要删.xlsx", col_names = T)

其中,../表示上一级目录(当前工作目录的上一级),不能省略。

以上是对于路径的简单介绍,大家要自己多加练习,仔细体会。

相对路径写起来更加简单,所以以下示例都会用相对路径进行演示。

除了路径问题,对于新手还有几个点需要注意

https://mmbiz.qpic.cn/mmbiz_png/tpAC6lR84R8Bd79xC88eibtve4h15CflNYC0FicOxbOeNpDmqIF1Lqbljzke2XGV2T4ILeZRPUoibdfV1drTNo8JA/640?wx_fmt=png&from=appmsg

csv

csv文件是一种逗号分隔文件,打开后和excel看起来一模一样,以下是一个csv文件示例,你不要问为什么看不到逗号......

https://mmbiz.qpic.cn/mmbiz_png/tpAC6lR84R8Bd79xC88eibtve4h15CflNnV0pfqLibJ4C0Y6XLr3SvFVwjaFwzhExPGxKgJ1EunbSzWaxd10bN8w/640?wx_fmt=png&from=appmsg

示例csv

一般推荐把excel文件另存为csv文件,因为方便R语言读取,不需要安装额外的R包也可以读取~

# read.csv是R自带的函数,不用加载R包;header = T 表示这个文件有列名
csv <- read.csv("datasets/brca_clin.csv", header = T)

csv

或者用read.table()函数读取。由于该函数可以读取很多格式,而每种文件格式的分隔符并不相同(比如csv文件是逗号分隔,txt文件是Tab分隔),因此在使用该函数时需要指定文件的分隔符

csv <- read.table("datasets/brca_clin.csv", header = T,
                  sep = "," # 指定分隔符!
                  )

csv

是不是很简单,注意点和excel一样。

``

read.table()函数是一个通用的读取表格型数据的函数,它既可以读取csv文件,又可以读取txt文件,只要指定不同的分隔符即可。

txt

txt文件也是我们常见的文件类型,通常这种数据也是可以直接读取的,不需要额外安装R包。

现在我们有一个这样的txt文件,它看起来不规整,但其实是规整的哦,不要被表象迷惑,也千万不要试图用空格键把它对齐!!

https://mmbiz.qpic.cn/mmbiz_png/tpAC6lR84R8Bd79xC88eibtve4h15CflN4BuH3j8RaRjbm3eP3BFowbIOaqvgx3iaibjPTGBb0nAYje4z78zcGD7g/640?wx_fmt=png&from=appmsg

txt文件

txt是tab键分隔的文件,在读取时,一定要指定分隔符:

tmp <- read.table("datasets/brca_clin.txt",
                  sep = "\t", # 必须要指定分隔符:\t,表示Tab键分隔
                  header = T)
tmp

tsv

这个类型的文件也是以\t为分隔符的,所以读取时和txt文件完全一样,使用read.table()函数即可,就不重复介绍了。

SPSS

如果是spss软件产生的.sav文件,可以使用foreign包中的read.spss()函数读取,或者使用haven包中的read_sav()函数。

这两个包在使用前需要先安装,安装过程这里就不演示了。

# foreign包读取
library(foreign)
spss <- foreign::read.spss("datasets/例03-05.sav",to.data.frame = T)

spss

这里的foreign::read.spss()使用了包的名字::函数名字这种方法,意思是指定使用foreign中的read.spss()函数。有时候不同的R包中会有相同名字的函数,使用这种方法可以避免混淆。

# haven包读取
library(haven)
spss <- read_sav("datasets/例03-05.sav")

spss

这个例子是比较简单的,有时候需要指定特定的编码方式,可以通过使用?read_sav/?read.spss查看更改编码的方式。

haven这个包是专门设计用来读取spss/SAS/STATA格式的文件的。

rdata

如果是rdata/Rdata/RData文件,这个是R自带的格式,大小写不影响,都能识别,直接load()即可,但是要**注意一定要写对文件路径!**或者也可以直接双击rdata/Rdata/RData文件,或者选中文件-单击鼠标右键-打开方式-选择Rstudio。

如果要读取一个名字为brca_example.rdata的文件,它位于datasets这个文件夹(这个文件夹是和当前工作目录同一级的)中,可以使用以下代码:

# 直接加载
load(file = "datasets/brca_example.rdata")

如果是rds文件,这个也是R常用的格式,使用readRDS()函数即可,也要注意文件路径

# 注意要取一个名字
tmp <- readRDS(file = "datasets/brca_example.rds")

常见的就是这些,当你掌握这些简单的之后,你可以尝试更加复杂的,以后肯定也会遇到,不过有了这些简单的作为基础,相信你能更快的解决这类问题。

查看文件

下面是一些常用的用于帮助检查数据的函数(后面的章节还会继续介绍):

dim(brca_clin)       # 查看数据有多少行多少列,dim是dimension的缩写
str(brca_clin)       # 查看数据的结构,几行几列?数据类型?
class(brca_clin)     # 数据类型
colnames(brca_clin)  # 查看列名
names(brca_clin)     # 查看列名
rownames(brca_clin)  # 查看行名
head(brca_clin)      # 查看前6行数据
tail(brca_clin)      # 查看最后6行数据
rm(brca_clin)        # 从当前环境(environment)中清除对象

保存文件

保存文件我觉得比读取文件要简单一点,如果你实在不知道怎么保存,有个简便方法,在Environment面板中有个保存按钮,点击即可保存所有对象到RData文件中:

https://mmbiz.qpic.cn/mmbiz_png/tpAC6lR84R8Bd79xC88eibtve4h15CflNjGmAm5K13q5e1kxcqGqZ4V3KfR9GcrmicQSv2spHat9o03BbJibKr35A/640?wx_fmt=png&from=appmsg

一键保存所有

直接点击保存,就会在你当前工作目录产生一个RData文件,下次直接load或者双击即可快速打开你的所有东西!不过不建议这么做,因为这个RData文件可能会很大。

不太推荐直接保存为excel格式,建议使用csv格式。

如果是想把tmp这个对象保存为csv文件,可以使用write.csv()或者write.table()write.table()read.table()类似,也是可以把文件保存为多种格式,只需要指定分隔符即可。

# 把tmp这个数据框保存为csv
write.csv(tmp, # 要保存的对象
          file = "datasets/111.csv", #保存到哪里?格式?.csv不要忘记!
          quote = F, # 不加引号
          row.names = F # 有没有行名
          )

# 或者使用write.table
write.table(tmp,
            file = "datasets/111.csv", #保存到哪里,保存为什么格式,.csv不要忘记!
            sep = ",",  # 必须指定分隔符!
            quote = F, # 不加引号
            row.names = F, # 行名
            col.names = T # 列名
            )

如果要保存为或者txt文件,也可以使用write.table()

write.table(tmp,
            file = "datasets/222.txt",
            sep = "\t", # 千万别忘记指定分隔符!
            quote = F, # 不加引号
            row.names = F, # 行名
            col.names = T # 列名
            )

如果要保存为rdata/Rdata/RData文件,直接用save()函数,简单方便,下次直接load即可,还可以同时保存多个对象!!

推荐大家平时保存时选择rdata/Rdata/RData/rds,方便,官方!

save(tmp,csv, # 同时保存多个对象
     file = "datasets/tmp1.rdata") # 保存文件的位置和名字

保存为rds格式:

# rds格式不能同时保存多个对象
saveRDS(tmp, file = "datasets/tmp.rds")

以上就是常见的数据读取和保存,最后再说一遍注意点: