zl程序教程

您现在的位置是:首页 >  其他

当前栏目

文件读写

2023-03-07 09:05:03 时间

一、文件读写(R语言与外部数据的沟通)

1.csv文件的读取方式:

1) excel读取

2) 读取为文本文件

3) sublime(适用于大文件)

4) R语言读取(表格文件读入到R语言里时,就得到了一个数据框,对数据框的修改不会同步到表格文件。

读取的文件名字可以更改,相当于另存为,但又不会覆盖原文件。

尽量不在原文件中进行任何操作)

###文件的格式不是由后缀决定的,是由本身的内容决定的。纯文本文件的后缀没有任何意义,只是约定俗成,起提示作用,不起决定性作用。

1.文件的读取

read.csv()      ##通常用于读取csv格式
read.table()    ##通常用于读取txt格式 

补充知识点 (1)读取工作目录下文件夹中的数据

read.csv("import/gene.csv")     #按tab键,import文件夹、gene.csv就会自动显示

# 工作目录下的已经存在的import文件夹下的gene.csv /表示不同文件夹之间的区分,或者是文件夹和文件之间的划分,表示下一级。

(2)读取不在工作目录下的文件

read.csv("../import/gene.csv")   # ../ 表示上一级文件夹,按tab键import就会出现,再按tab就能找到gene.csv文件

# 工作目录隔壁(上一级(桌面)的另一个下级文件夹import)的下的gene.csv

2.文件的导出

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

不推荐覆盖原文件,让代码可重复,数据可重现

3.R特有的数据保存格式:Rdata

是R语言特有的数据存储格式,无法用其他软件打开;

保存的是变量,不是表格文件

save() 保存。 load() 加载

save(test,file = "example.Rdata") 
load("example.Rdata")  

## file =不能省略,省略后会报错。因为保存变量的时候可以把好几个变量保存到同一个Rdata里面.

(1)在工作目录下新建文件夹,保存不同形式的文件

输入文件import。 输出文件export

surv=read.table("import/xxx.txt")
save(x,file="Rdata/xxx.Rdata")

(2)在不同工作目录下创建不同的文件夹,保存不同步骤需要的文件,怎么实现不同文件夹之间的衔接

load("../1_data_pre/xxx,Rdata")

4.文件读写部分代码解读

1).读取ex1.txt

ex1 <- read.table("ex1.txt")

##读取文件后发现第一行不是列名,如果不更改,后期数据处理会出现问题。

ex1 <- read.table("ex1.txt",header = T)   #修改后,列名就会正确的归位。

2).读取ex2.csv

ex2 <- read.csv("ex2.csv")     

##读取进来的文件和原文件的差别:1.行名和列名不对(行名没有正确识别,列名多了一个);2.列名中的符号变了;

更改方法:

ex2 <- read.csv("ex2.csv",row.names = 1,check.names = F)

#注意:数据框不允许重复的行名

rod = read.csv("rod.csv",row.names = 1)

Error in read.table(file = file, header = header, sep = sep, quote = quote, : 'row.names'里不能有重复的名字

rod = read.csv("rod.csv")

3).读取soft.txt

soft <- read.table("soft.txt")

Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : line 2 did not have 5 elements

报错原因:表格不规则,有一部分位置是空着的。

soft <- read.table("soft.txt",header = T,fill = T)  #其实不对,读取完的数据有一部分列是错误的

##read.table 这个函数中有个 sep="" 参数,sep=空字符串,只要两个数据之间分割符号是看不见的就会被当成一整个分割符号(比如一个空格,两个空格,一个制表符,两个制表符都看不到),需要做以下修改。

soft2 <- read.table("soft.txt",header = T,sep = "\t")
soft2 <- read.delim("soft.txt")      ## header = T,sep = "\t" 默认值可以不写,两者输出结果一样。
###一些函数的默认参数值
read.csv(file, header = TRUE, sep = ",", quote = "\"",
         dec = ".", fill = TRUE, comment.char = "", ...)
read.csv2(file, header = TRUE, sep = ";", quote = "\"",
          dec = ",", fill = TRUE, comment.char = "", ...)
read.delim(file, header = TRUE, sep = "\t", quote = "\"",
           dec = ".", fill = TRUE, comment.char = "", ...)
read.delim2(file, header = TRUE, sep = "\t", quote = "\"",
            dec = ",", fill = TRUE, comment.char = "", ...) 

4).soft 的行数列数是多少?列名是什么

dim(soft)

[1] 1000 5

colnames(soft)

[1] "ID" "SEQUENCE" "GeneName" "GB_ACC" "SPOT_ID"

5).将soft导出为csv

write.csv(soft,file = "soft.csv")   

###右上角环境中刚好出现了一个soft.csv的文件,并且刚好与数据框soft中的内容一样,

6).将soft保存为Rdata并加载。

save(soft,file = "soft.Rdata")    

###load的结果是让Rdata中的变量出现在环境中

rm(list = ls())      

###上一步刚把文件保存,soft.Rdata的文件还在环境中存在,此时load,看不出来任何变化,需要提前清空环境,或者重启session。

load(file = "soft.Rdata")    

####文件的格式由生成它的函数决定,不是由文件的名字决定的。

###小技巧:

# data.table   读取任何形式的文件 ,包括问题文件
soft = data.table::fread("soft.txt",data.table = F)
soft = data.table::fread("abc.mp4",data.table = F)
# rio
library(rio)  
a = import("complete_set.txt")
##不能读取问题文件,需要加上参数才能读取成功
a = import("abc.mp4",format = "\t") ##这个能读取成功
b = import_list("jimmy.xlsx")
b$Sheet1
b[[1]]
export(b,"jimmyzhenbang.xlsx")
export(b$Sheet1,"jimmyzhenbang.csv")

练习5-1:

6.加载y.Rdata(已保存在工作目录),求gene1列的平均值.

load("y.Rdata")
View(y)
mean(y$gene1)   #####Rdata是矩阵, 也可以是数据框、列表等任何形式的文件

Error in y$gene1 : $ operator is invalid for atomic vectors

class(y)      

[1] "matrix" "array"

###。class不能识别文件名称,是只能识别数据的函数。

判断数据类型的时候不带引号,不带后缀。比如class(c),class(x)

而class(“exercise.csv”), 就会反馈出来 “character”,把任何东西,无论对错,放进class里面,反馈出来都是“character”。

mean(y[,1])

[1] NA

Warning message:In mean.default(y[, 1]) : 参数不是数值也不是逻辑值:回覆NA

y[,1]      

GSM1 GSM2 GSM3 GSM4 GSM5 GSM6 #####行名出现在这里没有任何影响,只是一个名字而已

"40" "20" "51" "46" "38" "49" ###有用的是下面这一行字符串

y[,1] = as.numeric(y[,1])
y[,1]
mean(y[,1])

[1] GSM1 GSM2 GSM3 GSM4 GSM5 GSM6

"40" "20" "51" "46" "38". "49"

[1] NA Warning message:In mean.default(y[, 1]) : 参数不是数值也不是逻辑值:回覆NA

###转换不成功,y是矩阵,字符型矩阵。不允许转换其中一列或者一行,要改除非整个矩阵一起改.

###只有把整个矩阵转换成数据框。但是y中有字符型向量,有数值型向量,所以本身文件有问题,平时自己处理文件的时候直接输出为数据框、列表都可以。不保存为矩阵。

mean(as.numeric(y[,1]))

[1] 40.66667

c <- y[,1]
mean(as.numeric(c))

[1] 40.66667

##以上内容均来自于生信技能树的学习。