R语言_文件读取与保存

把外部数据读入R语言里以及在R语言处理的数据导出,怎么操作以及注意哪些细节:

1.认识csv格式

2.认识分隔符

3.将表格文件读入R语言,成为数据框

4.将数据框导出,成为表格文件

5.R语言特有的数据的类型:.Rdata

6.文件读写部分(重点)

7.进阶:可读入R语言的常见生信数据形式

8.进阶:读取文件的其他常用R包

1.认识csv格式

打开ex3.csv文件(生信技能树数提供)

windows电脑如果没有设置,通常不会显示文件后缀名。

设置:打开文件所在的文件夹--查看前方框打钩--文件扩展名前方框打钩,显示文件后缀,电脑知识一定要加强,融会贯通。

来自生信技能树小洁老师的课件图

1.1 csv打开方式(一):默认使用excel

在里excel自动加上横线和竖线,在渲染效果。

excel打开csv文件

1.2 csv打开方式(二):记事本打开

在excel里有竖线的地方在记事本里变成用逗号隔开。分隔符为逗号,这是csv的庐山真面目,其实csv就是纯文本文件。

记事本打开csv文件

1.3 csv打开方式(三):sublime软件打开(更适用大文件)

方便打开比较大的纯文本文件,记事本如果打开几百MB的文件会卡,但是sublime不会,而且sublime有代码高亮的功能,以后慢慢探索。

sublime打开csv文件

1.4 csv打开方式(四):R语言读取

a=read.csv("ex3.csv")
##输入a=read.csv("")时,光标在引号中间使用tab键补全,一定要加引号,不然会出现找不到对象,找不到对象(object)通常有两种情况:该加引号不加,或该赋值时不赋值。

R语言读取与前面3种方式是不一样的:

ex3.csv是真实存在的文件,R语言赋值的变量a不是电脑上一个真实文件,R语言内部的变量和电脑上的文件不是一码事,分清环境里的变量和工作目录下文件的关系。

读进R语言,就是个数据框,可赋值,变量名与文件名无必然联系。

表格文件读入到R语言里,就是个数据框,对数据框进行的修改(赋值,取子集等)不会同步到表格文件。

2.认识分隔符

CSV文件本身没有竖线,用excel打开,为什么会显示横线和竖线,是通过分隔符去识别的。

CSV文件官方标配常见:逗号,空格,制表符\t(用tab键摁出来的是制表符,在代码里显示的是\t

CSV的标准分隔符是逗号,也叫逗号分隔制文件:

CSV = Comma Separated Values

TSV以tab键分隔符:

TSV = Tab Separated Values

纯文本文件的后缀没有意义,只是约定俗成(有特例或是不守规则,不要对后缀太依赖)。后缀起提示作用,不起决定性作用。

既然后缀不起决定性作用,但是为什么还要加后缀,因为在windows电脑上有些软件会根据后缀去用什么软件打开。在编程语言世界里,后缀没那么强,只要文件内容是符合规则的一个方方正正,有分隔符,叫什么名字不是关键。

3.将表格文件读入R语言,成为数据框

3.1 read.csv()--通常读取csv格式

3.2 read.table()--通常用于读取txt格式

以下是非常重要的三个参数,有时候不是三个参数都一起用,用R语言读进来的文件,与excel打开原表格对比,选择合适的参数。
header = T,
check.names = F,
row.names=1

read.csv()
read.table()
# header = T,
#check.names = F,
#row.names=1
##实战中,参数选不对,导致数据框或是表达矩阵的列名不对,很难进行一些操作。

两者是同宗同源的函数,有些参数是相同的,但是默认参数设置可能有所不同。read.csv()是由read.table()演变而来,比较适合读取常规的csv文件,它的参数根据常规的csv文件习惯调一下默认参数,比如说把默认的分隔符就设置为逗号,做了适合读取csv的设置。

test = read.csv("ex3.csv")
class(test)
  • 再次强调变量名称和文件名称的区别:

文件名称写的话永远在实际参数的位置上,并且带着引号。变量名称一般都是在等号前面或是正常写在代码里,不会和引号一起出现。变量名称是一个数据,而文件名称是真实在电脑存在。

  • 直接读取csv如果失败,需要指定一些参数。

read.csv()是一个函数,函数就有默认参数,默认参数与读入表格对不上号的地方,读取出来比较变扭,比如行名和列名没有正确识别出来。

4.将数据框导出,成为表格文件

导出是指把R语言里的一个数据框导出去,变成电脑上的一个文件。

4.1 csv格式:write.csv()

write.csv(test,file="example.csv")
##test为要导出的数据框的变量名;example为给导出的文件命名,记得写上后缀csv
##运行完工作目录下就多了一个文件,可以进行发送。

4.2 txt格式:write.table()

write.table(test,file="example.txt")
##test为要导出的数据框的变量名;example为给导出的文件命名,记得写上后缀txt

读取--编辑修改--导出,不要覆盖原文件:

读取的文件是外部文件,不是自己做的,原始文件一定要保留,如果原文件丢了,代码出问题,没法追根溯源,所以导出的文件另取一个名

一定要把原始数据保存好,运行的代码也保留。

5.R语言特有的数据的类型:.Rdata

.Rdata文件里可以存放变量,而且不止一个变量,也是电脑里真实存在的文件,放在工作目录下,用load就可以加载。

  • .Rdata是R特有的数据储存格式,无法用其他软件打开,只能用R语言打开。

  • 保存的是变量,不是表格文件。凡是在R语言环境能起名的,占有一席之地的叫变量,可以存到.Rdata里,整存整取。

5.1 用save()--保存

save(test,file="example.Rdata")
##test只是一个变量名,可以以逗号为分隔符,添加多个变量,即可保存多个。保存多个变量,file=是不能省略的

5.2 用load()--加载

load("example.Rdata")
##使用时可以加载,但是保证save的文件在在工作目录下。
##干干净净地加载,直接load就好,不用赋值

5.3 Rproject的组织形式

脚本:.R

数据:.Rdata

表格:.txt.csv

常见报错:找不到文件

原因1:文件没有保存放于工作目录(Rproject)下。

原因2:拼写错误(用tab自动补齐)。

默认参数不适用于你的当前读取的文件,也会报错

6.文件读写部分(重点)

6.1 读取ex1.txt

ex1.txt文件为生信技能树提供。

ex1=read.table("ex1.txt")
##读进来是第一步,从环境变量里点开看文件是否正常
ex1[2,4]
#[1] "45351"
##本来应该是数值型,现在是字符型,用Excel打开原文件对比。
##列名没有正确识别的话,一列是一个向量,一个向量只有一种数据类型,如V1列有id,之后都是数值型,数值型变成字符型

?read.table
##在帮助文档里一个个去查看,默认设置header = FALSE,不给识别列名,修改默认参数。
read.table("ex1.txt",header = T)
#修改header = T,被正确识别,归位很重要。
ex1[2,4]
#[1] 31872,数值型。

读完后检查,用excel打开原文件,第一行是应该是列名,第二行才是正式内容,Excel里不做这个区分,R语言里,列名和每一列里正式内容是要区分开的,问题是该有的列名没有放在正确的位置上。

用R语言正确读入格式应该和用excel打开的格式一样,仔细观察行列的位置。如果不正确,修改函数的实际参数,或是默认值。

6.2 读取ex2.csv

ex2.csv文件为生信技能树提供。

read.csv("ex2.csv")
##初步读进来,在环境里把变量点开,再用Excel打开对比,观察是否有异常
##异常的地方:1.第一列x,2.列名的连接符号。R语言读取时,没有识别第一行是列名,填充一个x

?read.csv
##查看帮助文档的介绍说明,查看是哪一项引起的,可以多试试。
ex2 = read.csv("ex2.csv",row.names = 1)
##row.names = 1,把第一列识别成行名的意思,# row.names = 1,永远设置为1,。
##串改列名,.和-是不一样的。R语言改掉是因为不允许有特殊字符的存在,在帮助文档里一个个去找参数。
##check.names = TRUE为默认,检查行名和列名里有没有特殊字符,有的话就被改掉,强制把-改为.
ex2 = read.csv("ex2.csv",row.names = 1,check.names = F)
##在环境里点开ex2,显示正常
a=as.matrix(ex2)
##表达矩阵,表达矩阵的内容为数值,把数据框ex2为矩阵
a[1,2]
#[1] 13.67818,如果不设置row.names = 1,虽然转变为矩阵,但是里面的内容是字符型,没法作图和计算

用R语言读完后,用excel打开原始文件对比,找出不一样的点,查看帮助文档,试着设置参数

6.3 读取soft.txt,赋值给soft

soft = read.table("soft.txt")
##读进来报错,去查看原文件
##报错解释:文件本来是有5列,读着第2行就变成4列,不能识别。

有一个深坑:
用sublime打开,看着是空格,没问题。其实分隔符号是有两个,中间是一个空着的列,所以才会有两个分隔符。
R语言里识别的空格符 sep = "",只要是空着就行,识别空格和\t.给它两个制表符,它还是会识别成一个分隔符。两个制表符放在一起还是空的,凡是空的东西放在一起,它会识别为空的分隔符。

?read.table
##查看帮助文档,找到参数
soft = read.table("soft.txt", fill =T )
##加上参数fill =T,哪个地方有缺位,就用空格子补全。
##能读进来,在环境里点击变量soft看,列名没有正确识别,加参数header =T。
soft = read.table("soft.txt", fill =T, header = T )
##用sublime打开,在空格处,用tab键,出现两个空格,有一个为分隔符

soft = read.table("soft.txt", fill =T, header = T, sep = '\t' )
##sep = 为指定分隔符,这里指定的分割符为制表符'\t',指定一个\t'为分隔符,两个制表符放在一起,就知道中间那个隔该空着,才正常。
  • soft 的行数列数是多少?列名是什么
dim(soft)
#[1] 1000    5

colnames(soft)
#[1] "ID"       "SEQUENCE" "GeneName" "GB_ACC"   "SPOT_ID" 
  • 将soft导出为csv
write.csv(soft,"soft.csv")
##省略形式参数file=
  • 将soft保存为Rdata并加载
将soft保存为Rdata并加载。
save(soft,file = "soft.Rdata")
##只有soft一个变量时,形式参数file = 可以省略
rm(list=ls())
##用快捷键清空环境变量或是重启session(打开窗口)。才能看到加载是否成功。
load("soft.Rdata")
##输入load("so")用tab键补全,加载成功会在环境里显示soft变量

注意:用save() 函数保存几个变量时,形式参数file=不能省略,因为几个变量用逗号隔开,写上file=提示变量结束,可保存。

x= read.table("complete_set.txt")
save(x,file = "x.csv")
##没报错,看起来还是很正常
a = read.csv("x.csv")
##读入报错,并且用Excel打开,里面的内容乱码

##假如原始文件丢了,怎么办?
##用save生成,是Rdata文件,得用load加载
load("x.csv")
##成功加载

###结论:
##一个文件是什么类型文件,是由函数决定的,不是由叫什么(后缀)决定的,后缀只是起提示作用。用什么命令生成才是最重要的,用后缀是为了提示。记住什么样的命令对应什么样的文件。

6.4 文件读入R语言总结:

从外部读入一个文件,经常从官网上下载读入,如原始表达矩阵或是注释探针ids,在用R语言读入,同时用sublime软件打开,对比,看看是否需要调参数,一步步去设置,毕竟不是自己整的原始表格,有些数据的坑需要慢慢去试。

7.进阶:可读入R语言的常见生信数据形式

7.1 R语言能读取很多文件格式

来自生信技能树小洁老师的课件图

生信格式在上游分析的时候会提到,一般上游分析用Linux来完成,因为上游的数据比较大,Linux运行时比较快。Rstudio是图形界面,比较费空间,运行慢,但是看格式。目前只用在csv和txt,如果以后用生信格式,在网页上搜索,如:R read.fasta[https://www.rdocumentation.org/packages/seqinr/versions/4.2-8/topics/read.fasta]用得比较少

8.进阶:读取文件的其他常用R包

用于读取/导出文件的R包

来自生信技能树小洁老师的课件图

read.delim()比较好用,是read.table()的小变体,可以读取一些txt文件,它的默认参数有的和read.table()的有所区别。用read.table()读取txt文件,挑了参数也不成功,可以换成read.delim(),有可能该文件适合read.delim()的默认参数。

8.1 readr包

https://readr.tidyverse.org/

https://readr.tidyverse.org/reference/read_delim.html

哈德雷大神写的包,有几个函数,read_table()和read.table()功能有些同,但不是完全一样的,read_table()等函数是升级改造版的,有一些问题,除定义读取方式外,还定义一种新的数据结构,叫tibble,用tibble的函数读进去,就不是正常数据框,有两种数据,一个是data.frame一个是tibble,直接as.data.frame就可以,取子集比较兼容。它升级的地方在于:1.读取更加智能些,2.数据格式,tibble是一种优化的数据框。刚入门的文件比较小,读取大文件速度快。

8.2 data.table包:fread()常用的函数

fread()常用的函数:可以读入csv格式文件和txt格式文件

智能和快速,行名无用论(大神不处理矩阵,以数据框为目标,但是生信分析需要用表达矩阵),是哈德雷大神早期写的包

library(data.table)
a = fread('exp.csv')
##在环境里点开变量看,没有行名。
 class(a)
#[1] "data.table" "data.frame"
##exp.csv文件用read.csv读进来是数据框,但是用fread()读进来变成两种数据格式,不认识"data.table" 格式

##把讨厌的"data.table" 去掉,设置参数。
a = fread('exp.csv',data.table = F)
class(a)
#[1] "data.frame"
##只有数据框,这样取子集比较兼容

##设置行名
rownames(a) = a[,1]
a= a[,-1]

b = fread('ex1.txt')
##读进来感觉正常

8.3 rio包

有时候用R语言自带的base包里函数read.table(),找不到一些默认参数,就用rio包里的函数:

8.3.1 import():读入文件
library(rio)
import()
##读去标准文件时非常智能,但是读取不标准文件时如傻子一样。
?import
##根据后缀来怎么读取代码,以及一些小参数设置,还需要知道后缀只是起提示作用,不是决定作用。
import("gene.csv")
#    gene change score
# 1 gene1     up     5
# 2 gene2     up     3
# 3 gene3   down    -2
# 4 gene4   down    -4
import("gene.csv",format = '\t')
##能正常读取,包括.counts,soft为后缀的文件,可以用format = '\t'读取。

import()函数非常好用,不需要设置任何参数,可以读csv,txt,excel。也可以读取包括.counts,soft为后缀的文件,可用format = '\t'读取。

8.3.2 export():文件导出

根据文件的后缀导出什么文件

library(rio)
h = import("gene.csv",format = '\t')
export(h,file = "hh.csv")
##根据文件的后缀导出什么文件
export(h,file = "hh.xlsx")
##导出为xlsx后缀的文件
h = import("hh.xlsx",format = '\t')

原来用readxl::read_xls()来读取xlsx文件,但是对新手不友好的地方在于:依赖rjava,新手很难搞定。所以用rio包里的函数。

8.3.3 import_list():读取Excel多个工作簿

是读取Excel最好的方式,可以读取多个工作簿,就是一个Excel里有Sheet1,Sheet2..表格。


b = import_list("hh.xlsx")
##Excel里有多个工作簿就用import_list()函数读进来,结果以列表显示

export(b,file = "hh2.csv")
##可以导出,含多个工作簿的列表

说明

以上内容是听生信技能树小洁老师的R语言线上课,根据自己的理解记录下来,小洁老师授课非常细心,对不同水平的同学都照顾到,并且补充很多技巧以及注意事项。

没认真学习R语言读进csv格式文件前,不知道怎么设置函数的参数,经常报错,一旦报错后面的数据分析出问题。在实战时,从官网下载的文件,读入文件参数设置错,没法分析,比较折磨人。谢谢小洁老师精心设置的典型表格文件,并引导尝试解决一些报错的思路。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容