1.条件语句
1.1if(){ }
(1)只有if没有else,那么条件是FALSE时就什么都不做
i = -1
if (i<0) print('up')
if (i>0) print('up')
如在安包时常见的命令:
if(!require(tidyr)) install.packages('tidyr')
(2)有else
i =1
if (i>0){
print('+')
} else {
print("-")
}
(3)ifelse 如果是TRUE,则执行第一个
#ifelse()+str_detect(),王炸
samples = c("tumor1","tumor2","tumor3","normal1","normal2","normal3")
k1 = str_detect(samples,"tumor");k1
ifelse(k1,"tumor","normal")
k2 = str_detect(samples,"normal");k2
ifelse(k2,"normal","tumor")
2.for循环
也可应用于批量装包、批量画图:
#批量装包
pks = c("tidyr","dplyr","stringr")
for(g in pks){
if(!require(g,character.only = T))
install.packages(g,ask = F,update = F)
}
#批量画图
par(mfrow = c(2,2))
for(i in 1:4){
plot(iris[,i],col = iris[,5])
}
3.隐式循环
apply()族函数
3.1.apply 处理矩阵或数据框,循环
apply(X, MARGIN, FUN, …)
#其中X是数据框/矩阵名;
#MARGIN为1表示行,为2表示列,FUN是函数
#apply(X, 2, FUN, …)对x中每一列干什么
3.2.lapply
### 2.lapply(list, FUN, …)
# 对列表/向量中的每个元素实施相同的操作
lapply(1:4,rnorm)
练习:
#练习7-2----
# 1.加载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')
x=ifelse(deg$a>1&(deg$b)<0.05,"up",ifelse(deg$a< -1&(deg$b)<0.05,"down","no"))
table(x)
引用生信技能树