把外部数据读入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自动加上横线和竖线,在渲染效果。
1.2 csv打开方式(二):记事本打开
在excel里有竖线的地方在记事本里变成用逗号隔开。分隔符为逗号,这是csv的庐山真面目,其实csv就是纯文本文件。
1.3 csv打开方式(三):sublime软件打开(更适用大文件)
方便打开比较大的纯文本文件,记事本如果打开几百MB的文件会卡,但是sublime不会,而且sublime有代码高亮的功能,以后慢慢探索。
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/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格式文件前,不知道怎么设置函数的参数,经常报错,一旦报错后面的数据分析出问题。在实战时,从官网下载的文件,读入文件参数设置错,没法分析,比较折磨人。谢谢小洁老师精心设置的典型表格文件,并引导尝试解决一些报错的思路。