title: "note3"
output: html_document
date: "2023-05-14"
#复习#
#1数据结构包含4种,向量(一维),数据框,矩阵,列表,数据类型包括3种,数字,字符,逻辑,数据类型转换as(chat查询想要转换的东西对应的函数)
#2向量生成4种,c,:,(rep重复,seq(取出坐标为偶数的基因名),rnorm一组符合正态分布的数字),组合paste0)
#注释1seq()函数可以生成-3到3之间的100个数的等差数列,代码如下:seq <- seq(-3, 3, length.out=100)其中,seq是我们生成的变量名,第一个参数表示起始值,第二个参数表示结束值,第三个参数length.out表示需要生成的数字数量。通过这个函数生成的seq变量将包含100个在-3到3之间的数字。形式参数,实际参数可以改动.括号前面的代表函数,函数()=前面的部分是形式参数,可以省略不写,后面是实际参数,使用的时候可以修改的。[]前面是数据框或矩阵,[[]]前面是列
#3单个向量4种操作:
#(1)赋值加输出(2)数学计算,(3)条件判断生成的是逻辑值,生成长度相等的逻辑值(x==y,向量不一样长时,谁长取谁,(4)初级统计,(第一次出现视为没有重复)length(X判断向量长度,连接paste0(rep(“studengt”,length(x),x)3个向量不一样长时,谁长取谁),unique去重复,输出的是数据,duplicated判断是否有重复,输出的是逻辑值,tabie(统计重复值是哪些,每个重复值有几次),sort(x,decreasing =T)(=前面是形式参数,后面是实际参数,有的实际参数会有默认数值,这是用户可修改的)
#4两个向量进行的操作,4种
#(1)比较运算(逻辑比较),循环补齐,生成等长的逻辑向量(向量不一样长时,谁长取谁)(等位运算,向量长度不相等时,发生循环补齐,等位运算注意非整倍数有时会造成结果错误,如x$Species==c("a","c"))(2)数学计算(3)连接paste0,循环补齐,生成等长的逻辑向量(4)交集intersect会去重复(所以两个向量取子集,有哪些重复时,结果可能会出错,需要用%in%)、%in%,输出的是逻辑值(x[x%in%y],此时理解函数意义,x有哪些元素在y存在(会每个位置都比较),而x==y对应位置相同,所以会循环补齐)不会去重复、并集union、差集setdiff(x有哪些元素在y不存在)
#重点向量筛选(取子集)[]:中括号里面是向量(有4种生成方式)将TRUE对应的值挑选出来,FALSE丢弃。(1)按照逻辑值([]里面是逻辑值,与x对应,不必由x生成):中括号里是与x等长且一一对应的逻辑值向量(13个彩色球取出蓝色和绿色,x[x%in%y],13个数取>7,x[x>7]);(2)按照位置:中括号里是由x的下标组成的向量,x[2:4],x[c(1,5)],反选x[-4]#去掉第四个位置x[-(2:4)]#去掉234的位置(3)按名字
#修改向量中的某个/某些元素:取子集+赋值,改一个元素x[4]<-40;x;改多个元素x[c(1,5)] <- c(80,20);x
#part3 二维:数据框(data.frame,每列只允许一种数据类型,每列数据类型相同也可以),矩阵(matrix,只允许一种数据类型),列表(list),用class判断数据结构,因为有的函数只接受特定的数据类型,可用as转换(chat查询想要转换的东西对应的函数),可用view查看数据
#重点数据框1.虚拟文件,打开R才可见,不是真实电脑文件2.数据框要求每列数据的类型相同3.数据框单独拿出一列是向量,降维,
#1.数据框data.frame来源
# (1)用代码新建,,变量 <- data.frame()
# (2)由已有数据转换或处理得到,变量 <-read.csv/table(按TAB键导入文件名,不要手动输入)
# (3)读取表格文件view,dim,nrow,ncol,rownames,colnames,修改和取子集
# (4)R语言内置数据iris,volcano,letters,可用view查看数据
#2.新建和读取数据框
df1 <- data.frame(gene = paste0("gene",1:4),
change = rep(c("up","down"),each = 2),
score = c(5,3,-2,-4))
df1
## gene change score
## 1 gene1 up 5
## 2 gene2 up 3
## 3 gene3 down -2
## 4 gene4 down -4
df2 <- read.csv("gene.csv")
df2
## gene change score
## 1 gene1 up 5
## 2 gene2 up 3
## 3 gene3 down -2
## 4 gene4 down -4
#3.数据框属性
#
dim(df1)#统计行列数
## [1] 4 3
nrow(df1)#统计行数,paste0(“a”,1;nrow(a))
## [1] 4
ncol(df1)#统计列数,计算最后一列,取/不取子集最后一列,df1[,ncol(df1)],df1[,-ncol(df1)],
## [1] 3
#
rownames(df1)#行名,本质是向量,修改全部行名或其中一个,本质还是向量修改
## [1] "1" "2" "3" "4"
colnames(df1)#列名
## [1] "gene" "change" "score"
#改行名和列名
rownames(df1) <- c("r1","r2","r3","r4")
#只修改某一行/列的名
colnames(df1)[2] <- "CHANGE"
#4.数据框取子集1$一次只能取1列,2按坐标,名字(一次可以取多列),逻辑
df1$gene #删掉score,按tab键取文件/文件列
## [1] "gene1" "gene2" "gene3" "gene4"
mean(df1$score)
## [1] 0.5
## 按坐标
df1[2,2]
## [1] "up"
df1[2,]#取[行,]继承行名和列名,筛选test中,Species列的值为a或c的行,test[test$Species %in% c("a","c"),]
## gene CHANGE score
## r2 gene2 up 3
df1[,2]#取1列[,列],降维输出,没有,时取的是列
## [1] "up" "up" "down" "down"
df1[c(1,3),1:2]
## gene CHANGE
## r1 gene1 up
## r3 gene3 down
## 按名字
df1[,"gene"]
## [1] "gene1" "gene2" "gene3" "gene4"
df1[,c('gene','change')]#取多列,还是二维
## Error in `[.data.frame`(df1, , c("gene", "change")): undefined columns selected
## 按条件(逻辑值),回到[]:将TRUE对应的值挑选出来,FALSE丢弃。筛选差异基因
df1[df1$score>0,]#某列中>0的行筛选出来,还是二维
## gene CHANGE score
## r1 gene1 up 5
## r2 gene2 up 3
#筛选score >0的基因,某列中>0的行中某列元素筛选出来,一维
df1[df1$score > 0,1]
## [1] "gene1" "gene2"
df1$gene[df1$score>0]#相当于向量[逻辑值],逻辑值,与x对应,不必由x生成
## [1] "gene1" "gene2"
## 代码思维
#如何取数据框的最后一列?
df1[,3]
## [1] 5 3 -2 -4
df1[,ncol(df1)]
## [1] 5 3 -2 -4
#如何取数据框除了最后一列以外的其他列?
df1[,-ncol(df1)]
## gene CHANGE
## r1 gene1 up
## r2 gene2 up
## r3 gene3 down
## r4 gene4 down
#筛选score > 0的基因
df1[df1$score > 0,1]
## [1] "gene1" "gene2"
df1$gene[df1$score > 0]
## [1] "gene1" "gene2"
#5.数据框修改
#改一个格
df1[3,3] <- 5
df1
## gene CHANGE score
## r1 gene1 up 5
## r2 gene2 up 3
## r3 gene3 down 5
## r4 gene4 down -4
#改一整列,或在最后一列新增加一列(没有就新增,有就替换)
df1$score <- c(12,23,50,2)
df1
## gene CHANGE score
## r1 gene1 up 12
## r2 gene2 up 23
## r3 gene3 down 50
## r4 gene4 down 2
#?
df1$p.value <- c(0.01,0.02,0.07,0.05)
df1
## gene CHANGE score p.value
## r1 gene1 up 12 0.01
## r2 gene2 up 23 0.02
## r3 gene3 down 50 0.07
## r4 gene4 down 2 0.05
#改行名和列名
rownames(df1) <- c("r1","r2","r3","r4")
#只修改某一行/列的名
colnames(df1)[2] <- "CHANGE"
#6.两个数据框的连接,merge
test1 <- data.frame(name = c('jimmy','nicker','Damon','Sophie'),
blood_type = c("A","B","O","AB"))
test1
## name blood_type
## 1 jimmy A
## 2 nicker B
## 3 Damon O
## 4 Sophie AB
test2 <- data.frame(name = c('Damon','jimmy','nicker','tony'),
group = c("group1","group1","group2","group2"),
vision = c(4.2,4.3,4.9,4.5))
test2
## name group vision
## 1 Damon group1 4.2
## 2 jimmy group1 4.3
## 3 nicker group2 4.9
## 4 tony group2 4.5
test3 <- data.frame(NAME = c('Damon','jimmy','nicker','tony'),
weight = c(140,145,110,138))
test3
## NAME weight
## 1 Damon 140
## 2 jimmy 145
## 3 nicker 110
## 4 tony 138
merge(test1,test2,by="name")
## name blood_type group vision
## 1 Damon O group1 4.2
## 2 jimmy A group1 4.3
## 3 nicker B group2 4.9
merge(test1,test3,by.x = "name",by.y = "NAME")
## name blood_type weight
## 1 Damon O 140
## 2 jimmy A 145
## 3 nicker B 110
#注释2merge左连接。使用merge()函数进行连接操作。左连接可以使用merge(x, y, by="common_column", all.x = TRUE)实现,其中x和y是要连接的两个数据集,by指定用于连接的列名,all.x设置为TRUE表示保留左侧数据集的所有行。右连接可以使用merge(x, y, by = "common_column",all.y=TRUE)实现,其中all.y设置为TRUE表示保留右侧数据集的所有行。
#注释3如何按照数据框的某一列,给整个数据框排序order,使用order()函数按照数据框的某一列对整个数据框进行排序。具体操作如下:假设有一个数据框为df,要按照其中的column_name列进行排序,可通过以下代码实现:df<-df[order(df$column_name), ]这会返回按照column_name列升序排列的数据框。如果需要降序排列,只需将排序表达式中的逗号后面的空格替换为decreasing = TRUE,即:df <- df[order(df$column_name, decreasing = TRUE), ]这会返回按照column_name列降序排列的数据框。
#注释4如何按照数据框的某一列,给整个数据框去重复,可以使用unique()函数按照数据框的某一列对整个数据框进行去重操作。具体操作如下:假设有一个数据框为df,要按照其中的column_name列进行去重,可通过以下代码实现:df_unique <- unique(df[, c("column_name")])这会返回一个只包含column_name列且无重复行的数据框df_unique。如果需要保留所有列并仅去除重复行,则可以将上述代码中的c("column_name")替换为NULL,即:df_unique <- unique(df)这会返回一个去除重复行后的完整数据框df_unique。
##### 矩阵matrix和列表
m <- matrix(1:9, nrow = 3)
colnames(m) <- c("a","b","c") #加列名
m
## a b c
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
m[2,]
## a b c
## 2 5 8
m[,1]
## [1] 1 2 3
m[2,3]
## c
## 8
m[2:3,1:2]
## a b
## [1,] 2 5
## [2,] 3 6
m
## a b c
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
t(m)#矩阵转置,行列互换
## [,1] [,2] [,3]
## a 1 2 3
## b 4 5 6
## c 7 8 9
as.data.frame(m)#矩阵m要变成数据框,需要赋值,仅运行这句m数据类型还是矩阵
## a b c
## 1 1 4 7
## 2 2 5 8
## 3 3 6 9
pheatmap::pheatmap(m)#矩阵画热图,默认聚类
#列表,一般要提取,并用as转换
l <- list(m1 = matrix(1:9, nrow = 3),
m2 = matrix(2:9, nrow = 2))
l
## $m1
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
##
## $m2
## [,1] [,2] [,3] [,4]
## [1,] 2 4 6 8
## [2,] 3 5 7 9
l[2]#数据类型是列表,而有些函数如热图只接受数据类型矩阵
## $m2
## [,1] [,2] [,3] [,4]
## [1,] 2 4 6 8
## [2,] 3 5 7 9
l[[2]]#列表取子集,数据类型是矩阵,两个[[]]/$
## [,1] [,2] [,3] [,4]
## [1,] 2 4 6 8
## [2,] 3 5 7 9
l$m1
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
# 补充:加元素的名字,按名字取子集
scores = c(100,59,73,95,45)
names(scores) = c("jimmy","nicker","Damon","Sophie","tony")
scores#加名字是属性,不属于表格内容
## jimmy nicker Damon Sophie tony
## 100 59 73 95 45
scores["jimmy"]
## jimmy
## 100
scores[c("jimmy","nicker")]
## jimmy nicker
## 100 59
names(scores)[scores>60]
## [1] "jimmy" "Damon" "Sophie"
# 删除 ,ctrl+l,清空控制台
rm(l)#删除一个
rm(df1,df2)#删除多个
rm(list = ls()) #删除全部,ls环境中所有变量,列出一个包里所有函数或数据
jimmy <- function(a,b,m = 2){
(a+b)^m
}#写函数的函数
jimmy(a = 1,b = 2)
## [1] 9
jimmy(1,2)
## [1] 9
jimmy(3,6)
## [1] 81
jimmy(3,6,-2)
## [1] 0.01234568
#复习:绘图函数plot()
par(mfrow = c(2,2)) #把画板分成四块,两行两列
#如果报错,把右下角画板拉大一点即可
x = c(2,5,6,2,9);plot(x)
x = seq(2,80,4);plot(x)
x = rnorm(10);plot(x)
x = iris$Sepal.Length;plot(x)
#思考:plot画iris的前四列?
plot(iris[,1],col = iris[,5])
plot(iris[,2],col = iris[,5])
plot(iris[,3],col = iris[,5])
plot(iris[,4],col = iris[,5])
#当一个代码需要复制粘贴三次,就应该写成函数或使用循环
jimmy <- function(i){
plot(iris[,i],col=iris[,5])
}
jimmy(1)
jimmy(2)
jimmy(3)
jimmy(4)
# R包安装,R包:多个函数的打包存放,包含函数,数据,帮助文件,描述文件,library里面是R包,没有就安装(3种),安装成功的标识是library没有error
#options("repos"=c(CRAN="http://mirrors.tuna.tsinghua.edu.cn/CRAN/"))
#options(BioC_mirror="http://mirrors.ustc.edu.cn/bioc/")
#install.packages()
#BiocManager::install()
#devtools::install_github() #括号里写作者用户名加包名
# 清华镜像
# http://mirrors.tuna.tsinghua.edu.cn/CRAN/
# http://mirrors.tuna.tsinghua.edu.cn/bioconductor/
# 中科大镜像
# http://mirrors.ustc.edu.cn/CRAN/
# http://mirrors.ustc.edu.cn/bioc/
#library(tidyr)
#require(tidyr)
# 分情况讨论
if(!require(stringr))install.packages("stringr")
# 获取帮助
#?seq
#library(stringr)
#browseVignettes("stringr")
#ls("package:stringr")
#文件读写部分
#csv, 以逗号为分隔符的纯文本文件,竖排对应次序的逗号相当于连线。文件打开方式1默认EXCEL,2记事本,3subline(适用大文件)4R语言读取,一般赋值读取,文件读取了,就会生成数据框,对数据框进行的修改不会同步到表格文件
#TSV(\t 制表符tab分隔))
#但是纯文本文件的这些后缀没有意义,只是约定俗称,如果一个文件后缀是csv,但是制表符分隔,也没有问题
#1.读取ex1.txt(含列名)
ex1 <- read.table("ex1.txt")#此时第一行是列名,txt默认header=F
ex1 <- read.table("ex1.txt",header = T)#此时列名正确显示
#class(ex1) 返回data.frame,class("ex1.txt")返回字符,因为class函数并不接受文件名称作为实际参数,所有""都会返回字符,不管里面是什么内容
#2.读取ex2.csv
ex2 <- read.csv("ex2.csv")
ex2 <- read.csv("ex2.csv",row.names = 1,check.names = F)#csv默认header=T,因此需要列名。有行名是需要用row.names=1归化
#列名中有特殊字符如-会被R自动转换,因此需要check.names=F
#注意:数据框不允许重复的行名
rod = read.csv("rod.csv",row.names = 1)#尝试将第一列设置行名但失败,因为有重复的字符(a,a,b,b)
## Error in read.table(file = file, header = header, sep = sep, quote = quote, : duplicate 'row.names' are not allowed
rod = read.csv("rod.csv")
#3.读取soft.txt,不规则数据框,第4列825行以下空,第五列825以下有数据
soft <- read.table("soft.txt") #第五列825以上无数值,此时报错
## 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) #其实不对
soft2 <- read.table("soft.txt",header = T,sep = "\t")#这才是正确语句
#read.table语句中,默认sep="",一切空白如连续两个制表符会被当成一个分隔符,因此自动填充会串行,#sep参数是用来指定分隔符的,默认值为空格。它可以接受任何单个字符或字符串作为参数,用于将文本数据内容分割成列。常见的分隔符包括逗号(,),制表符(\t),分号(;)等。例如,当读取以逗号分隔的CSV文件时,应该将sep参数设置为逗号(,)。当sep = "\t"时,read.table将使用制表符作为分隔符来读取文本文件中的数据。
#4.soft 的行数列数是多少?列名是什么
dim(soft)
## [1] 1000 5
colnames(soft)
## [1] "ID" "SEQUENCE" "GeneName" "GB_ACC"
## [5] "SPOT_ID"
#5.将soft导出为csv
write.csv(soft,file = "soft.csv")
#6.将soft保存为Rdata并加载。Rdata是R特有的数据储存形式,不是表格文件;保存的是变量。
save(soft,file = "soft.Rdata")
rm(list = ls())
load(file = "soft.Rdata")
#7实战项目组织方式一,不同文件类型放在不同文件夹存储
surv=read.table("import/xxx.txt") #import文件夹里读取数据
## Error in file(file, "rt"): cannot open the connection
save(x,file='Rdata/xxx.Rdata') #储存到Rdata文件夹里
## Error in save(x, file = "Rdata/xxx.Rdata"): object 'x' not found
#实战项目组织方式二,在文件夹二中调用文件夹一中的数据
load("../1_data/xxx.Rdata") #../指上一级文件夹
## Error in readChar(con, 5L, useBytes = TRUE): cannot open the connection
#用于读取导出文件的R包-rio: import(),import_list(),export()
#6.加载y.Rdata(已保存在工作目录),求gene1列的平均值
load(file='y.Rdata')##y是矩阵,因此虽然显示数字,但因为最后一列是字符,所以所有元素都变成了字符型向量,所以mean(y[,1])会报错
y[,1]#y是矩阵,不能用y$gene1,可以y[,1],也可以y[,"gene1"]
## GSM1 GSM2 GSM3 GSM4 GSM5 GSM6
## "40" "20" "51" "46" "38" "49"
mean(as.numeric(y[,1])) #y为字符矩阵,因此需要转换#y[,1] = as.numeric(y[,1]);y[,1],此时赋值不成功,因为y[,1]还是代表矩阵第一列,而矩阵只会允许一种数据类型,要改除非整个矩阵一起改
## [1] 40.66667
#如果要把矩阵中的字符都转换成数字,需改成数据框
class(y) #字符矩阵,最后一列为字符,其余为数字字符
## [1] "matrix" "array"
z <- as.data.frame(y);z
## gene1 gene2 gene3 gene4 gene5 gene6
## GSM1 40 15 22 600 25 123
## GSM2 20 45 77 544 33 124
## GSM3 51 12 26 350 30 55
## GSM4 46 11 20 390 45 334
## GSM5 38 12 24 260 20 543
## GSM6 49 10 25 220 33 239
## grouplist
## GSM1 control
## GSM2 control
## GSM3 control
## GSM4 treat
## GSM5 treat
## GSM6 treat
class(z) #数据框
## [1] "data.frame"
ncol(z)
## [1] 7
z[,1:(ncol(z)-1)] <- as.numeric(y[,1:(ncol(z)-1)]) #或
z[,1:(ncol(z)-1)] <- as.numeric(unlist(z[,1:(ncol(z)-1)]))
#矩阵可以直接转为数字向量,数据框需要unlist()
jimmy <- function(a,b,m = 2){
(a+b)^m
}
jimmy(a = 1,b = 2)
## [1] 9
jimmy(1,2)
## [1] 9
jimmy(3,6)
## [1] 81
jimmy(3,6,-2)
## [1] 0.01234568
#复习:绘图函数plot()
par(mfrow = c(2,2)) #把画板分成四块,两行两列
#如果报错,把右下角画板拉大一点即可
x = c(2,5,6,2,9);plot(x)
x = seq(2,80,4);plot(x)
x = rnorm(10);plot(x)
x = iris$Sepal.Length;plot(x)
#思考:plot画iris的前四列?
plot(iris[,1],col = iris[,5])
plot(iris[,2],col = iris[,5])
plot(iris[,3],col = iris[,5])
plot(iris[,4],col = iris[,5])
#当一个代码需要复制粘贴三次,就应该写成函数或使用循环
引用生信技能树,闻季起舞 This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.
When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
You can also embed plots, for example:
Note that the echo = FALSE
parameter was added to the code chunk to prevent printing of the R code that generated the plot.
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。