专栏名称: 生信菜鸟团
生信菜鸟团荣誉归来,让所有想分析生物信息学数据的小伙伴找到归属,你值得拥有!
目录
相关文章推荐
生信人  ·  Nat Med | ... ·  昨天  
BioArt  ·  Nat Commun | ... ·  昨天  
生物学霸  ·  76 项 /28 项,2025 国自然形审明细表 ·  昨天  
生信菜鸟团  ·  期刊泛读 | Cell 出版社 | 优质期刊 ·  2 天前  
51好读  ›  专栏  ›  生信菜鸟团

R语言入门05:文件读取和导出(初学必看!)

生信菜鸟团  · 公众号  · 生物  · 2024-10-28 18:29

正文


为了方便大家学习,我已经录制了 配套的视频 ,放在了哔哩哔哩(我的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?)、年龄、性别等。

它里面的内容是这样的:

示例excel

现在我们需要把它读入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 结尾的文件;每个函数的功能都是有要求的,不能乱用,记得多查看函数的帮助文档。

  • 如果你读取中文遇到乱码问题,那大概率是遇到了编码问题,这是一个很复杂的问题:

    utf8编码
    • 有时直接升级R包/R/rstudio/,重新保存文件为utf-8等方式也可以解决问题;
    • 如果都不行,直接百度!具体情况具体分析!
    • 首先你可以通过点击Rstudio中的 Tools - Global Options ,到达以下界面,把默认编码方式改为 utf-8 ,然后关闭rstudio,重新读取;

csv

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

示例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文件

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 格式的文件的。







请到「今天看啥」查看全文