前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言专题3-条件和循环

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

原创
作者头像
生信汪一昂
发布2023-09-17 15:09:08
1860
发布2023-09-17 15:09:08
举报
文章被收录于专栏:生信学习之路生信学习之路

专题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) # 装包的时候别问问题别更新
}

引用自生信技能树

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 专题3.条件和循环
  • 1.条件语句-if(){}
    • 1.1 只有if
      • 1.1.1 利用if来进行长脚本管理
    • 1.2 有else
      • 1.3 ifelse(重点!)
        • 1.4 多个条件
          • 补充:case_when()
          • 2.循环语句-for(){}
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
          http://www.vxiaotou.com