美文网首页R语言的学习
R语言_文件读取与保存

R语言_文件读取与保存

作者: Ashu | 来源:发表于2022-05-22 21:44 被阅读0次

    把外部数据读入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格式文件前,不知道怎么设置函数的参数,经常报错,一旦报错后面的数据分析出问题。在实战时,从官网下载的文件,读入文件参数设置错,没法分析,比较折磨人。谢谢小洁老师精心设置的典型表格文件,并引导尝试解决一些报错的思路。

    相关文章

      网友评论

        本文标题:R语言_文件读取与保存

        本文链接:https://www.haomeiwen.com/subject/nvllprtx.html