R语言专题3-条件和循环

2023-09-17 15:09:08 浏览数 (1)

专题3.条件和循环

1.条件语句-if(){}

1.1 只有if

代码语言:text复制
# if()里的内容一定得是逻辑值,可以是你写上的T和F,也可以是运算结果
# 若运算结果为T或者你写上了T,他就会执行后续语句,反之则不执行
# 这边演示的代码较短,因此不加{}问题也不大

i = -1
if (i<0) print('up')
代码语言:txt复制
## [1] "up"
代码语言:text复制
if (i>0) print('up') # 这边就不会执行

1.1.1 利用if来进行长脚本管理

代码语言:text复制
# 1.if(F){},则{}里的代码被跳过
#   if(T){},则{}里的代码被运行
# 凡是带有{}的代码均可以被折叠

1.2 有else

这部分可以简单理解为如果...,就...,否则...

代码语言:text复制
i = 1
if (i<0){
  print('small')
} else {
  print('big')
}
代码语言:txt复制
## [1] "big"
代码语言:text复制
# 翻译成中国话就是:i = 1,如果i<0,就输出小,否则就输出大。应该很好理解

1.3 ifelse(重点!)

代码语言:text复制
# 3个参数
# ifelse(x,yes,no)
# x:逻辑值或者逻辑向量;yes:逻辑值为T时的返回值;no:逻辑值为F时的返回值

# 简单示范
i = 1
ifelse(i>0,' ','-')
代码语言:txt复制
## [1] " "
代码语言:text复制
# 灵活一些,取三个随机数康康
x = rnorm(3);x
代码语言:txt复制
## [1]  0.1171687 -0.1286477  0.3504566
代码语言:text复制
ifelse(x>0,' ','-')
代码语言:txt复制
## [1] " " "-" " "
代码语言:text复制
# 与字符检测函数str_detect()进行连用,用之前别忘记加载R包
library(stringr)

# 1.随便生成一个向量,取名样本。其中包含3个tumor和3个normal
samples = c("tumor1","tumor2","tumor3","normal1","normal2","normal3")
# 2.利用str_detect()函数检测样本里的每个元素是否包含'normal'
k1 = str_detect(samples,"normal");k1
代码语言:txt复制
## [1] FALSE FALSE FALSE  TRUE  TRUE  TRUE
代码语言:text复制
# 3.设置2分组'normal'和'tumor'
ifelse(k1,"normal","tumor")
代码语言:txt复制
## [1] "tumor"  "tumor"  "tumor"  "normal" "normal" "normal"

1.4 多个条件

代码语言:text复制
# 说白了也离不开"如果...,就...,否则..."的局势
i = 0
if (i>0){          # 比较i是否大于0
  print(" ")       # 如果i大于0,就输出" "
} else if (i==0){  # 否则就比较i是否等于0
  print("0")       # 如果i等于0,就输出"0"
} else if (i<0){   # 否则就比较i是否小于0
  print("-")       # 如果i小于0,就输出"-",三种情况必满足一种
}
代码语言:txt复制
## [1] "0"
代码语言:text复制
# 用ifelse写
i = 0
ifelse(i>0," ",ifelse(i<0,"-","0")) # 简单的嵌套结构,大家可以先从看懂模仿开始
代码语言:txt复制
## [1] "0"

补充:case_when()

代码语言:text复制
# 用之前先加载R包dplyr
library(dplyr)

# 先来个简单的,case_when是按顺序进行判断的
i = 0
case_when(i>0 ~ " ", # 如果i大于0,就输出" "
          i<0 ~ "-", # 如果i小于0,就输出"-"
          T ~ "0")   # 如果i等于0,就输出"0"。这边不写T也可以写"i = 0"
代码语言:txt复制
## [1] "0"
代码语言:text复制
# 切合实际地增加一丢丢难度
options(scipen = 20) # 因为看着不舒服,所以不让他以科学计数法显示
x = c(0.01,0.001,0.07,0.03,0.00001); x
代码语言:txt复制
## [1] 0.01000 0.00100 0.07000 0.03000 0.00001
代码语言:text复制
# 由于case_when按顺序进行判断,条件严格的往前写哈
# 这个用来看p值比较多
case_when(x <= 0.0001 ~ "****",
          x <= 0.001 ~ "***",
          x <= 0.01 ~ "**",
          x <= 0.05 ~ "*",
          x > 0.05 ~ "ns")
代码语言:txt复制
## [1] "**"   "***"  "ns"   "*"    "****"

2.循环语句-for(){}

代码语言:text复制
# 简单理解下
for( i in 1:4){ # i是称呼,前后对应,后面那个范围可自己调节
  print(i) # 看下输出结果大家就应该知道啥意思了
}
代码语言:txt复制
## [1] 1
## [1] 2
## [1] 3
## [1] 4
代码语言:text复制
# 循环画图-以内置数据iris为例
par(mfrow = c(2,2)) # 将画板变成两行两列,这样四个图就会分别跑去四个角
for(i in 1:4){
  plot(iris[,i], col = iris[,5])
}
代码语言:text复制
#批量装包
pks = c("tidyr","dplyr","stringr")
for(g in pks){
  if(!require(g,character.only = T)) # 只识别字符,这些参数大家不了解也问题不大
    install.packages(g,ask = F,update = F) # 装包的时候别问问题别更新
}

引用自生信技能树

0 人点赞