为了方便大家学习,我已经录制了
配套的视频
,放在了哔哩哔哩(我的B站账号:
阿越就是我),
免费观看
,复制以下网址粘贴到浏览器打开即可:
https://space.bilibili.com/42460432/channel/collectiondetail?sid=3740949
本期目录:
-
工作路径
-
读取文件
-
Excel
-
csv
-
txt
-
tsv
-
SPSS
-
rdata
-
查看文件
-
保存文件
在之前的几章中,我们详细介绍了R语言、Rtools、Rstudio以及R包的安装,解决新手最先碰到的两大难题!
大家学习R语言肯定是为了处理自己的数据,不是为了使用R自带的数据练手。所以这一章就给大家演示:
如何把数据读入R语言?如何把数据另存为其他格式?
结合上一章的内容,本章内容其实就是
选择合适的函数
对数据进行读写操作。
大家在日常生活中遇到的最多的数据应该还是Excel数据,但是对于R语言来说,我们必须要把外部数据读入到R里面,才能进行各种操作。对于我们使用R语言处理之后的数据,可能还需要再保存为excel格式。
这两个问题对于会的人来说非常简单,可以有多种方法可以实现,但是对于新手来说却经常遇到报错。今天
从一个新手的角度说一说R语言的数据读取和另存问题
。
工作路径
首先说下工作路径的问题,当前工作目录(working-directory)是你的R语言读取和保存文件的默认位置。
如果你没改过的话,这个位置有一个默认值,在第2章介绍过:点击
Tools
-
Global Options
,按照以下图片所示进行设置,方框里的就是默认的工作目录。
确定好你的R语言的工作目录以及你的文件的存放位置后,才能顺利读取文件,
比如你的工作目录在D盘,但是你的文件在E盘
,如果读取时没有明确指定文件位置,就会报错。
打开RStudio后,可以使用
getwd()
查看当前工作目录:
getwd()
以上结果说明我在:F盘-R_books-R_beginners这个文件夹里。
也可以查看
Console
(控制台)的左上角获取当前的工作目录:
可以使用
setwd()
重新设置当前工作目录:
# 设置为F盘R_books文件夹
setwd("F:/R_books/")
注意,在R中写路径时需要使用斜杠
/
,而不是反斜杠
\
,如果你要在路径中使用反斜杠,必须用两个
\\
,比如:
F:/R_books/
和
F:\\R_books\\
都是正确的,但是
F:\R_books\
是错误的。
确认当前工作目录是非常重要的,尤其是在读取或者保存文件的时候,你总得知道你目前在哪个文件夹吧?
以下是一些用于管理R工作路径的函数:
除此之外还有一些可以和当前工作目录交互的函数,比如列出当前工作目录下的所有文件和文件夹:
list.files()
# 类似的函数还有dir()
还可以只列出符合要求的文件,比如列出所有以
qmd
结尾的文件:
list.files(pattern = "qmd$") # 涉及正则表达式
读取文件
不同文件有不同的后缀名,Windows系统可更改是否显示后缀名(一般推荐显示后缀名,方便判断到底是哪种类型的文件):
不同的后缀名说明文件是不同的格式,不同的格式需要不同的软件(函数)才能打开,乱用就会导致打不开或者打开乱码。
Excel
这个格式太常见了,大家日常生活用的大部分都是这种格式。
比如有这么一个excel文件:
brca_clin.xlsx
,这个数据是我从TCGA官网下载的乳腺癌患者的临床信息,包含:患者ID、样本ID、样本类型(normal还是tumor?)、年龄、性别等。
它里面的内容是这样的:
现在我们需要把它读入R里面。
我推荐你使用
readxl
包读取Excel文件。这个R包并不是“出厂自带”的,因此我们需要先安装这个R包(提醒:你更改镜像了吗?):
install.packages("readxl")
安装好之后,我们需要加载这个R包才能使用:
library(readxl)
然后我们就可以读取这个文件了,
读取时,你必须指明你的文件在哪里!
这就涉及到工作路径的问题了,如果你的文件和当前工作路径不在同一个文件夹下,那么一定要指定你的文件在哪里。如果文件路径没写对,就会出现下面这种类似的报错,一般情况下,它会告诉你:你的路径没写对、或者找不到这个文件、这个文件不存在、不能打开连接等等错误。
# col_names = TRUE 表示这个文件是有列名的
brca_clin
Error: `path` does not exist: ‘E:/brca_clin.xlsx’
这个时候你就要去确认下,你的这个
brca_clin.xlsx
文件到底在哪里!当你给它正确的路径时,它就不会报错。比如这个示例文件位于
F盘-R_books文件夹-R_beginners文件夹
中,你写对了就能读进来:
# 读取
brca_clin
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
# 或者
brca_clin
其中的
./
表示当前工作路径,可以省略不写。
如果一个名字是
brca_expr.xlsx
的文件位于
F盘-R_books文件夹-R_beginners文件夹-datasets文件夹
中,也就是说
datasets
这个文件夹是
和当前工作路径同一级
的,但是我们要读取的文件在
datasets
文件夹中,那么在读取时就可以这么写:
# 加了一个datasets/
brca_expr
如果一个名字是
brca_expr_不要删.xlsx
的文件位于
F盘-R_books文件夹
中,也就是说位于
当前工作路径的上一级文件夹
中,如果要读取这个文件,可以使用以下代码:
brca_expr_不要删
其中,
../
表示上一级目录(当前工作目录的上一级),不能省略。
以上是对于路径的简单介绍,大家要自己多加练习,仔细体会。
相对路径写起来更加简单,所以以下示例都会用相对路径进行演示。
除了路径问题,对于新手还有几个点
需要注意
:
-
注意
/
,
\
,
""
,
''
,这些标点一定要在
英文状态下输入
!R语言的文件路径只支持
/
或者
\\
,不能是
\
;
-
这个示例文件是有
列名
的,所以在读取的时候加了
col_names=T
这个参数,没有列名就要改成
F
;
-
如果你的数据使用了
合并/拆分单元格、各种格式、公式等
,会报错!复杂的表头在读取时代码也会变得很复杂,建议大家初学时都整理成示例文件这种简单的表头;
-
这个文件是
.xlsx
格式的,如果不是,那你需要用其他函数,比如:使用
read_xls()
函数读取
.xls
结尾的文件;每个函数的功能都是有要求的,不能乱用,记得多查看函数的帮助文档。
-
如果你读取中文遇到乱码问题,那大概率是遇到了编码问题,这是一个很复杂的问题:
-
-
有时直接升级R包/R/rstudio/,重新保存文件为utf-8等方式也可以解决问题;
-
-
首先你可以通过点击Rstudio中的
Tools
-
Global Options
,到达以下界面,把默认编码方式改为
utf-8
,然后关闭rstudio,重新读取;
csv
csv文件是一种
逗号分隔文件
,打开后和excel看起来一模一样,以下是一个csv文件示例,你不要问为什么看不到逗号......
一般推荐把excel文件另存为csv文件,因为方便R语言读取,不需要安装额外的R包也可以读取~
# read.csv是R自带的函数,不用加载R包;header = T 表示这个文件有列名
csv
csv
或者用
read.table()
函数读取。由于该函数可以读取很多格式,而每种文件格式的分隔符并不相同(比如csv文件是逗号分隔,txt文件是Tab分隔),因此在使用该函数时需要
指定文件的分隔符
:
csv sep = "," # 指定分隔符!
)
csv
是不是很简单,注意点和excel一样。
read.table()
函数是一个通用的读取表格型数据的函数,它既可以读取csv文件,又可以读取txt文件,只要指定不同的分隔符即可。
txt
txt文件也是我们常见的文件类型,通常这种数据也是可以直接读取的,不需要额外安装R包。
现在我们有一个这样的txt文件,它看起来不规整,但其实是规整的哦,不要被表象迷惑,也
千万不要试图用空格键把它对齐!!
txt是
tab
键分隔的文件,在读取时,一定要指定分隔符:
tmp 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
spss
这里的
foreign::read.spss()
使用了
包的名字::函数名字
这种方法,意思是指定使用
foreign
中的
read.spss()
函数。有时候不同的R包中会有相同名字的函数,使用这种方法可以避免混淆。
# haven包读取
library(haven)
spss
spss
这个例子是比较简单的,有时候需要指定特定的编码方式,可以通过使用
?read_sav/?read.spss
查看更改编码的方式。
haven
这个包是专门设计用来读取
spss/SAS/STATA
格式的文件的。