Day1 R语言基础
数据类型
数值型(右对齐)、字符型(左对齐)、逻辑性(NA:存在但未知的东西*NA作为向量值和谁在一起就是什么类型)
class( ) 判断数据类型的函数
比较运算的返回结果是逻辑值:>,<,>=,<=,==,!=
逻辑运算:多个逻辑条件的链接 与& ,或| ,非!
eg:3<5&>5 FALSE !(4>5) TRUE
数据类型的判断和转换:is族函数 返回值为逻辑值
eg:is.numeric( ) 是否为数值型
as族函数 实现数据类型之间的转换
eg:as.numeric( ) 将其他数据类型转化为数值型
Day2
数据结构(向量,数据框,矩阵,列表)
2.0数据框/向量
数据框约等于表格,是R语言内部的数据不是真实存在
要求每一列的数据类型是统一的
数据框单独拿出一列是向量,可以视为一个整体,一个向量只能由一种数据类型,可以有重复值
2.1向量的生成
(1)用c( )逐一放在一起
c(1,2,3,4,5) [1] 1 2 3 4 5
( 2)连续的数字用冒号
1:5 [1] 1 2 3 4 5
(3)有重复的用rep( ),有规律的序列用seq( ),随机数用rnorm( )
rep("x",times=3/each=3)>each 参数即为每个重复的次数 [1] "x" "x" "x"
seq(from=3,to=21,by=3) [1] 3 6 9 12 15 18 21
rnorm(n=3) [1] 生成三个随机数
(4)通过组合产生更加复杂的向量
paste0(rep("x",times=3),1:3) [1] "x1" "x2" "x3"
*paste和paste0之间的联系:paste0是paste的简化版本,paste的默认分割符号是空格,可以使用sep参数指定分隔符,paste0是无缝连接
tips:数据类型转换的优先顺序:字符型>数值型>逻辑型
在遵守规则的情况下,保留最多的信息
2.2对单个向量进行的操作
(1)赋值
x <- c(1,3,5,1) #规范的赋值符号:<- 快捷键alt+“-”
x=c(1,3,5,1) #随意的写法
#赋值+输出一起实现: (x<- c(1,3,5,1))
#两句或多句代码写在同一行: x<- c(1,3,5,1);x
(2)简单的数学计算
x+1 log(x) sqrt(x)
(3)根据某系条件进行判断,生成逻辑值向量
x<- c(1,3,5,1)
x>3 [1] FALSE FALSE TRUE FALSE
x==3 [1]FALSE TRUE FALSE FALSE
(4)初级统计
max(x) 最大值 length(x) 长度
min(x) 最小值 unique(x) 去重复 (第二次到第多次出现则发生重复,仅保留第一个)
mean(x) 均值 duplicated(x) 判断是否重复:重复了就是TRUE 没有重复为FALSE
median(x) 中位数 table(x) 重复值统计
var(x) 方差 sort(x) 从小到大排排序sort(x) [1] 1 1 3 5
sd(x) 标准差 sort(x,decreasing=F) [1] 1 1 3 5
sum(x) 总和 sort(x,decreasing=T) [1] 5 3 1 1
R语言的"默认思想"
?+函数名查帮助文档
很多函数都有自己的默认参数
2.3对两个向量的操作
(1)比较运算,生成等长的逻辑向量
x=c(1,3,5,1)
y=c(3,2,5,6)
x==y [1] FALSE F T F
(2)数学计算
(3)连接
paste(x,y,sep=",") [1] "1,3" "3,2" "5,5" "1,6"
当两个向量长度不一致,发生循环补齐(发生条件:等位运算,两个向量元素与元素之间一对一的运算,两个向量长度不相等)
x = c(1,3,5,6,2)
y = c(3,2,5)
x == y [1] F F T F T
利用循环补齐简化代码
paste0(rep("x",3),1:3) == paste0("x",1:3)
[1] "x1" "x2" "x3"
(4)交集,并集,差集
x = c(1,3,5,1)
y = c(3,2,5,6)
交集 intersect(x,y) [1] 3 5
并集 union(x,y) [1] 1 3 5 2 6
差集 setdiff(x,y) [1] 1
差集 stediff(y,x) [1] 2 6
重点:%in%(没有快捷键)
x %in% y #x的每个元素在y中存在吗?
[1] FALSE TRUE TRUE FALSE
== ,+-*/ ,paste paste0 是等位运算,循环补齐
2.4向量筛选(取子集)
对象[ 条件 ]:将TRUE对应的值挑选出来,FALSE丢弃
(1)逻辑值取子集:eg:x=c(8,9,10,11,12)
x==10
[1] FALSE FALSE TRUE FALSE FALSE
x[x==10]
(2)下标位置取子集:eg:x=c(8,9,10,11,12)
x[4] #取下标为4的数 ==》11
x[2:4]#取下标为2到4的数 ==》9 10 11
x[-4]#去掉第四个下标为4的数
2.5修改向量中的某个/某些元素:取子集+赋值
R语言内的所有修改都需要经过赋值,没有赋值就没有发生过
eg:x = x[x ==10]
以上为赋值操作
x [1] 8 9 10 11 12
(1)改一个元素
x[4] <- 40 [1] 8 9 10 40 12 *负号不能和<一起容易出错
(2)改多个元素
x[c(1,5)] <- c(80,20) [1] 80 9 10 40 20
2.6简单向量作图
eg:k1 = rnorm(12) ;12
plot(k1) #简单做图,横坐标为下标,纵坐标为k1
eg:k2 = rep(c("a","b","c","d"),each=3) ;k2
boxplot(k1~k2) #箱线图:k1为纵坐标,k2为横坐标
Day3 数据框,矩阵和列表
一维:向量vector
二维”表格“:矩阵matrix 是允许一种数据类型(常用的是数值型)
数据框data.frame每列只允许一种数据类型,列与列之间没有限制
列表list可装万物
数据框
3.1数据框来源
(1)用代码新建
(2)由已有数据转换或处理得到
(3)表格文件的读取
(4)R语言的内置数据
*View(volcano)可以看火山图的内部数据
3.2新建数据框
df1 <- data.frame(gene =paste0("gene",1:4),
^ change=rep(c("up","down"),eanch-2),
| score =c(5,3,-2,-4))
这个是变量名,不起决定作用
列名和列的内容,列与列之间需要用逗号隔开
文件的读取:df2 <- read.csv("gene.csv")
3.3数据框的属性
dim(df1)#返回df1的行数和列数
nrow(df1) #返回他的行数
ncol(df1) #返回他的列数
rownames(df1) #返回行名,不允许有重复值
colnames(df1) #返回列名
3.4数据框的取子集
提取列:df1$score
按坐标
df1[2,2] 一个单独的数据df1[2,] 第二行df1[,2] 第二列df1[c(1,3),1:2] 取第一行和第三行,第一列和第二列
解决报错的思维:
1.对比成功的代码,数据与报错的代码,数据之间的差别
2.读懂error后面的字
按名字(可以实现一下取多列)
df1[,"gene"] 按列名df1[,c('gene','change')]
按条件(逻辑值)
df1[df1$score>0,]
如何提取数据框的最后一列:df1[,ncol(df1)]
如何提取数据框除了最后一列以外的其他列:df1[,-ncol(df1)]
3.5数据框修改
#改一个格df1[3,3] <- 5df1#改一整列df1$score <- c(12,23,50,2) df1
#新增一列df1$p.value <- c(0.01,0.02,0.07,0.05) df1
#改行名和列名rownames(df1) <- c("r1","r2","r3","r4")#只修改某一行/列的名colnames(df1)[2] <- "CHANGE"
3.6两个数据框的连接
merge(test1,test2,by="name") name表示共同列的列名
merge(test1,test2,by.x=" ",by.y=" ")表示相同数据内容不同列名的两个表格的连接
利用R包中的dplyr的inner_join()函数也可以实现数据框的连接:x2=inner_join(dat,ids,by = "probe_id")
区别:inner是取交集的,merge写参数后可以有别的用处
3.7数据框按照逻辑值取子集
##按条件(逻辑值)
df1[df1$score>0,]
按行进行取子集
矩阵
3.1矩阵新建和取子集
m <- matrix(1:9, nrow = 3) #1-9组成矩阵,排除三行m[2,] m[1,2] m[,1] m[2:3,1:2] #取子集
3.2矩阵的转置和转换
colnames(m) <- c("a","b","c") #加列名
#转置:行变列,列变行 t(m)
#转换为数据框:as.data.frame(m)
3.3矩阵画热图
> m
a b c
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
pheatmap::pheatmap(m,cluster_cols=F,cluster_rows=F)
形成聚类树:相似行和列会放在一起
列表
3.1列表新建和取子集
#新建
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]]或者l$m2[,1] [,2] [,3] [,4][1,] 2 4 6 8[2,] 3 5 7 9
补充:元素的名字-names()
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"
l[2]是list l[[2]]是一个matrix
删除变量
删除一个:rm(l)
删除多个:rm(df1,m)
删除全部:rm(list=ls())
清除控制台:ctrl+l
Day4 函数和R包
4.1函数和参数
4.1.1形式参数与实际参数
seq(from=3,to=2,by=3)
函数 形式参数,熟练后可以忽略 实际参数
4.1.2写函数的函数
jimmy <- function(a,b,m = 2){ (a+b)^m}
function是创造函数的函数
jimmy(1,2) 9
jimmy(3,6,-2) 0.01234568
4.2用函数替代复制粘贴
jimmy <- function(i){ plot(iris[,i],col=iris[,5])}
jimmy(1)
*当代码需要复制粘贴三次以上就应该写成循环或者函数
4.3默认参数
没写的参数即为用了默认值
4.4R包介绍
R包是什么:R包理解为多个函数的打包存放,包含数据、函数、帮助文件和描述文件等。
R包的安装:基于分析需求按需安装。
R包在哪里:CRAN(install.packages())、Bioconductor(BiocManager::install())、GitHub(devtools::install_github())加引号
R包如何安装:如上
安装后需要加载:library() 、 require()一次安装,每次打开新的窗口session都需要加载。不加引号
已经安装的包,可以用::快速调用里面的函数 包名::函数名 eg:pheatmap::pheatmap(volcano)
4.5R包的使用场景
学绘图,用到ggplot2
(1)快速查看函数的帮助文档sd( R包的名字 )
(2)去R包页面搜索limma package
(3)browseVignettes运行作者写的网页教程,前提是先加载这个包
(4)列出一个包里有哪些函数或者数据:ls("package:stringr")
*文件名称必须带引号,且在能识别文件名称的函数括号里,实际参数的位置上
分情况讨论
if(!require(stringr))install.packages("stringr") #安装好了require为TRUE,安装失败为FALSE
Day5 文件读写
5.1认识csv格式
getwd()查看工作目录
tab写文件名称
5.1.1 csv的打开方式
(1)默认excel,双击
(2)用记事本打开
(3)sublime(适用大文件)
(4)R语言读取,对数据框的修改不会同步到表格文件,数据框可以导出文件但不是文件
5.2认识分隔符
常见的分隔符号:逗号、空格、制表符\t
关于文件后缀
CSV=Comma Separated Values 以逗号为分隔符的文件
TSV=Tab Separated Values 以tab为分隔符的文件
纯文本文件的后缀没有意义,只是约定俗成,起提示作用不起决定作用
5.3将表格文件读入R语言,成为数据框
read.csv("") 通常读取csv格式
read.table("")通常读取txt格式
#直接读取失败就需要指定参数
*如果想知道文件读入后是什么数据结构,应该输入class(test),而不是输入文件名称,输入"ex3.csv"只会收到character的类型
5.4数据框的导出,成为表格文件
csv格式:write.csv()
读取 >>编辑修改 >> 导出(不要覆盖原文件,让代码可重复,数据可重现)
5.5R特有的数据保存格式:Rdata
Rdata是文件,是R语言特有的数据存储格式,保存的是变量,不是表格文件
save()保存 load() 加载
eg: save(test,file="example.Rdata")
load("example.Rdata")
##获取隔壁文件的Rdata文件
(1)load("绝对路径")
(2)load("相对路径")利用tab键补齐../
5.6实战项目的组织方式
5.6.1归类:输出文件,输入文件,输出图片,保存到Rdata,脚本和Rmd文件,project文件等等
工作目录下的文件夹: 文件夹名/文件名
load隔壁文件夹的文件 ../ :上一级
#1.当读取文件ex1 <-read.table("ex1.txt")发现列名所在的格式不对时,
应:ex1 <- read.table("ex1.txt",header = T)
#2.当输入命令ex2 <- read.csv("ex2.csv")发现行名未归位,且特殊字符改变为点号,
则ex2 <- read.csv("ex2.csv",row.names = 1,check.names = F) 设置行名,且不要检查列名
*数据框不允许重复的行名,解决方法:
1.先不加row.names参数读进来
2.处理第一列的重复值
3.将第一列设为行名
#3.读取soft.txt发生串列
soft <- read.table("soft.txt"),发现最后一列是空着的因此会报错
如果采用soft <- read.table("soft.txt",header = T,fill = T) #其实不对,会发生串列
解决办法:自行指定分隔符soft2 <- read.table("soft.txt",header = T,sep = "\t")
#4.将soft保存为Rdata并加载。
save(soft,file = "soft.Rdata")rm(list = ls()) 把环境中的变量清空load(file = "soft.Rdata") 把Rdata文件出现在环境里
要经常检查数据,查看数据类型!!!
5.7fread函数如何使用
library(data.table) #加载
a = fread("soft.txt",data.table=F) ####fread函数没有设置行名的参数
library(rio)
export(a,file="a.xlsx")
b=list(iris = iris, a = a )
export(b,file = "b.xlsx")
###把列表直接导出来xlsx
import_list >>直接读出列表
Day6作图
6.1常用可视化R包和函数
作图:base ggplot2 ggpubr
拼图:par里的mfrow grid.arrange cowplot customLayout patchwork
导出:经典三段论 ggsave eoffice>>topptx
6.2基础包——绘图函数
6.3ggplot2语法
#1.入门级绘图模板:作图数据,横纵坐标
ggplot(data = iris)+ #data放数据框 geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length))
**ggplot2特殊语法:列名不带引号,行末写加号
#2.属性设置(颜色、大小、透明度、点的形状,线型等)
#2.1 手动设置,需要设置为有意义的值
ggplot(data = iris) + geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length), color = "blue") color在geom_point的参数
ggplot(data = iris) + geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length), size = 5, # 点的大小5mm alpha = 0.5, # 透明度 50% shape = 8) # 点的形状:数字标号表示
#2.2 映射:按照数据框的某一列来定义图的某个属性ggplot(data = iris)+ geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length, color = Species)) color属于aes参数,是列名
## 自行指定映射的具体颜色?
ggplot(data = iris)+ geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length, color = Species))+ scale_color_manual(values = c("blue","grey","red")) ###color和species内的种类是配套出现的
scale_shape_manual(values=c( ))
## 区分color和fill两个属性
Q2-1 空心形状和实心形状都用color设置颜色
ggplot(data = iris)+ geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length, color = Species), shape = 17) #17号,实心的例子
ggplot(data = iris)+ geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length, color = Species), ##color是管边框的 shape = 2) #2号,空心的例子
Q2-2 既有边框又有内心的,才需要color和fill两个参数
ggplot(data = iris)+ geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length, color = Species), shape = 24, fill = "black") #24号,双色的例子
#3.分面:把一张图分成多张子图
#单分面
ggplot(data = iris) + geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) + facet_wrap(~ Species) ##按照species拆分分成spacies个子图
#双分面
dat = iris #把iris内容创给datdat$Group = sample(letters[1:5],150,replace = T) #新增一列 sample是随机抽样,样本数量比总体大的话要使replace=Tggplot(data = dat) + geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) + facet_grid(Group ~ Species) ##按照group,species两列分
**文件名只会出现在将文件导入R语言的那一刻
#4几何对象
#几何对象可以叠加
局部:仅对当前图层有效:原代码:gg
plot(data = iris) + geom_smooth(mapping = aes(x = Sepal.Length, y = Petal.Length))+ geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length))
全局:对所有图层有效:简化后的代码:ggplot(data = iris,mapping = aes(x = Sepal.Length, y = Petal.Length))+ geom_smooth()+ geom_point()
#5统计变换
统计变换-直方图View(diamonds)table(diamonds$cut)
ggplot(data = diamonds) + geom_bar(mapping = aes(x = cut)) ##y是自己算,数量 geom bar,条形图
ggplot(data = diamonds) + stat_count(mapping = aes(x = cut)) ##statcount 另外一个角度的画图函数
y=..prop..也可以写成y=after_stat(prop),group=1是把全部的柱子看做整体计算它的百分比
#6位置关系
##6.1抖动的点图ggplot(data = iris,mapping = aes(x = Species, y = Sepal.Width, fill = Species)) + geom_boxplot()+ geom_point()
ggplot(data = iris,mapping = aes(x = Species, y = Sepal.Width, fill = Species)) + geom_boxplot()+ geom_jitter()
##堆叠直方图
ggplot(data = diamonds) + geom_bar(mapping = aes(x = cut,fill=clarity)) ##用两列
ggplot(data = diamonds) + geom_bar(mapping = aes(x = cut,fill=clarity),position="dodge")
position="fill" >>设成比例
#7坐标系
#翻转coord_flip()
ggplot(data = mpg, mapping = aes(x = class, y = hwy)) + geom_boxplot() + coord_flip()#极坐标系coord_polar()bar <- ggplot(data = diamonds) + geom_bar( mapping = aes(x = cut, fill = cut), width = 1 ) + theme(aspect.ratio = 1) + labs(x = NULL, y = NULL)barbar + coord_flip()bar + coord_polar()
完整绘图模板
ggplot(data=<DATA>)+ ##画图数据
<GEOM_FUNCATION>##画图函数(mapping=aes(MAPPINGs)##映射,stat=<STAT>##统计变换时,position=<POSITION>)+ ##位置关系
<COORDINATE_FUNCTION>+ ###坐标系
<FACET_FUNCTION> ###分面
6.3ggpubr 代码直接搜
##ggpubr的列名是需要加引号的
p <- ggboxplot(iris, x = "Species", y = "Sepal.Length", color = "Species", shape = "Species", add = "jitter") #画箱线图的函数my_comparisons <- list( c("setosa", "versicolor"), c("setosa", "virginica"), c("versicolor", "virginica") ) #组间比较,由于本例有很多组价比较,因此将他们组成一个列表传递给一个参数comparisons,等号前是参数名称,等号后是参数的值p + stat_compare_means(comparisons = my_comparisons)+ stat_compare_means(label.y = 9) ## Add pairwise comparisons p-value,把总体比较的p值添加到图上
6.4图片的保存
ggplo2系列:ggsave("iris_box_ggpubr.png")
ggsave(p,filename="iris_box_ggpubr2.png")
通用:三段论 (保存的格式及文件名称:pdf("test.pdf"),作图代码,画完了,关闭画板(dev.off()))
eg:#1.基础包作图的保存pdf("iris_box_ggpubr.pdf")boxplot(iris[,1]~iris[,5])text(6.5,4, labels = 'hello')dev.off() #代码可运行却不出图,因为画板被占用多次运行到null device()为止
**eoffice[可以把图片导出成ppt]:超多点的热图不适用,ppt会卡住
library(eoffice)
topptx(p,"iris_box_ggppubr.pptx")
#拼图
R包patchwork:支持直接p1+p2拼图
6.5找现成的代码
STHDA
1.看别人的图怎么做的
Day7 R语言综合运用
7.1玩转字符串
加载stringr包:library(stringr)
1.str_length( )
x <- "The birch canoe slid on the smooth planks."
x###1.检测字符串长度str_length(x) #有多少字符串length(x) #计算向量的长度,即有多少引号
2.str_split( )字符串拆分
str_split(x," ") #返回出的结果是个列表x2 = str_split(x," ")[[1]];x2
y = c("jimmy 150","nicker 140","tony 152")str_split(y," ")str_split(y," ",simplify = T)
`y = c("jimmy 150","nicker 140","tony 152") #y是个长度为3的向量str_split(y," ")[[1]][1] "jimmy" "150"
[[2]] [1] "nicker" "140"
[[3]] [1] "tony" "152"
str_split(y," ",simplify = T) #把数据简化成矩阵[,1] [,2] [1,] "jimmy" "150"[2,] "nicker" "140"`[3,] "tony" "152"``
3.str_sub( )按位置提取字符串
str_sub(x,5,9) #截取5-9的字符
4.str_detect( )字符检测
str_detect(x2,"h") #返回与x2等长且一一对应的逻辑值向量,判断字符串中是否含有关键值
str_starts(x2,"T") #是否以T开头
str_ends(x2,"e") #是否以e结尾返回逻辑值
5.字符串的替换
str_replace(x2,"o","A")#把o换成A ,但只替换第一次匹配到的str_replace_all(x2,"o","A") #把o换成A,所有都替换
6.字符删除
str_remove(x," ") #只去掉第一个空格str_remove_all(x," ") #删除全部的空格
7.大写变小写:str_to_lower()
7.2数据框排序
加载R包dplyr:library(dplyr)
1.arrange( )
arrange,更加灵活的排序,默认从小到大排序
library(dplyr)arrange(test, Sepal.Length)arrange(test, desc(Sepal.Length))#修改默认参数为按照Sepal.Length从大到小排序arrange(test, desc(Sepal.Width),Sepal.Length)
2.distinc( )去重复
distinct(test,,Species,.keep_all=T) #重复到只出现一次,.keep_all=T即为展示完全列
3.mutate( ):新增一列数据框
mutate(test,new=Sepal.Length * Sepal.Width) #新增一列new的数据框,内容是Sepal.Length * Sepal.Width
***但是运行该行代码后,test数据仍然不变,因为没有赋值,没有赋值就等于没发生过
4.order( ) :order 可以给向量排序,也可以给数据框排序
sort(test$Sepal.Length)test$Sepal.Length[order(test$Sepal.Length)] #只显示一列
test[order(test$Sepal.Length),] #显示全部,且从小到大test[order(test$Sepal.Length,decreasing = T),] #显示全部,且从大到小
5.补充:select( ),filter( )筛选列,行
6.连续的步骤
x1=select(iris,-5) #去掉iris的第五列
x2=as.matrix(x1)
x3=head(x2,50)#取x2的前50行
pheatmap::pheatmap(x3)
嵌套方法优化代码:(由里到外写)
pheatmap::pheatmap(head(as.matrix(select(iris,-5)),50))
管道符 %>%优化代码:将代码直接往下传递 快捷键:crtl+shift+m
优点:易读,不产生中间变量
iris%>%
select(-5)%>%
as.matrix()%>%
head(50)%>%
pheatmap::pheatmap( )
优秀题目:
3.加载deg.Rdata,根据a、b两列的值,按照以下条件生成向量x:
#a< -1 且b<0.05,则x对应的值为down;#a>1 且b<0.05,则x对应的值为up;#其他情况,x对应的值为no
统计up、down、no各重复了多少次
load("deg.Rdata")k1 = deg$a< -1 & deg$b<0.05;table(k1)k2 = deg$a>1 & deg$b<0.05;table(k2)x = ifelse(k1,"down",ifelse(k2,"up","no"))
7.3条件与循环
1条件语句
(1)if(一个逻辑值){ }
只有逻辑值是true才会运行
插播:长脚本管理方式
1.if(F),{...},则{}里的代码被跳过(保留但不反复运行的代码),反之则会被运行,凡是带有{}的代码均可以被折叠
2.分成多个脚本,每个脚本最后保存Rdata,下一个脚本开头清空在加载:rm(list=ls()) load("")
(2)if( ){ }else{ }
i =1if (i>0){ print('+')} else { print("-")}
重点:ifelse函数 ifelse(x,yes,no)
x:逻辑值或逻辑值向量
yes:T的返回值;no:F的返回值
ifelse(i>0,"+","-")
x=rnorm(3)ifelse(x>0,"+","-")
ifelse()+str_detect()
samples=c("t1","t2","t3","n1","n2","n3")
k1=str_detect(samples,"t");k1 [1] T T T F F F
ifelse(k1,"t","n") [1] "t" "t" "t" "n" "n" "n"
(3)多个条件
i = 0if (i>0){ print('+')} else if (i==0) { print('0')} else if (i< 0){ print('-')}
ifelse(i>0,"+",ifelse(i<0,"-","0"))
2for循环
对x里的每个元素i进行同一操作:for(i in x){CODE}
批量作图
par(mfrow=c(2,2)) #把画板分成两行两列
for(i in 1:4){plot(iris[,1],col=iris[,5])}
批量装包
pks=c("tidyr","dplyr",'stringr") #pks就是一个普通向量
for(g in pks){
if(!require(g,character.only =T))#避免歧义,识别包里的内容
install.packages(g,ask=F,update=F)}
7.4隐式循环
矩阵/数据框的隐式循环——apply,返回结果是向量
apply(X,MARGIN,FUN...)
X是矩阵/数据框名字
MARGIN为1表示行,为2表示列
FUN是函数
对X的每一行/列进行FUN这个函数
批量画图
par(mfrow=c(2,2))
apply(iris[,1:4],2,plot,col=iris[,5]) ##如果有写不下的参数,继续写在apply的括号里
三种方法:
1:load("test2.Rdata")m=apply(test, 1, var)names=tail(sort(m),1000)
2:load("test2.Rdata")
a=names(tail(sort(apply(test,1,var)),1000))3:b=test%>% apply(1,var)%>% sort()%>% tail(1000)%>% names()
identical(a,b)
向量/列表的隐式循环——lapply
lapply(list,FUN,...) #对列表、向量中的每个元素实施相同的操作
#返回值是列表,对列表中的每个元素(向量)求均值(试试方差var,分位数quantile)
lapply(test,mean)lapply(test,fivenum)
lapply(1:4,rnorm) #1234分别进行rnorm
批量画图
lapply(1:4,function(i)){
plot(iris[,i],col=iris[,5])}
批量装包
pks=c("tidyr","dplyr",'stringr")` #pks就是一个普通向量
qa=function(g{
if(!require(g,character.only =T))`#避免歧义,识别包里的内容
`install.packages(g,ask=F,update=F)}
lapply(pks,qa)
7.5数据框的连接
##inner_join:取交集
##left_join:左连接
##right_join:右连接
##full_join:全连接
7.6表达矩阵画箱线图
将表达矩阵改成数据框——转置
把行名变成新数据的一列
宽变长
表达矩阵
set.seed(10086) #抽到的一组随机数字,让随机的成果变得可以固定下来
exp = matrix(rnorm(18),ncol = 6) #把这十八个数字排列成六列
exp = round(exp,2) # 四舍五入,保留小数点后两位rownames(exp) = paste0("gene",1:3) #给表达矩阵加行名colnames(exp) = paste0("test",1:6) #给表达矩阵加列名exp[,1:3] = exp[,1:3]+1 #让前三列和后三列有区别,得到前三列比后三列大的表达矩阵exp
library(tidyr)library(tibble)library(dplyr)dat = t(exp) %>% #转置 as.data.frame() %>% #变数据框 rownames_to_column() %>% #行名变成一列 mutate(group = rep(c("control","treat"),each = 3)) #在dat上新增一列名为group,内容为3个control和3个treat
pdat = dat%>% #处理表达矩阵 pivot_longer(cols = starts_with("gene"), #宽变长,把列给合并,给予列名,原本宽下的数字变成一列叫count names_to = "gene", values_to = "count")
library(ggplot2)p = ggplot(pdat,aes(gene,count))+ geom_boxplot(aes(fill = group))+ theme_bw()pp + facet_wrap(~gene,scales = "free") #分面:三个基因分成三张子图
一些顶呱呱的函数
match() #用于在向量中查找某个值,并返回该值在向量中第一次出现的位置。
dir() #用于列出指定目录中的文件和子目录的名称。
file.create() #用于创建一个或多个空文件。
file.exists() #用于检查指定的文件是否存在。
file.remove() #用于删除指定的文件。
重点