条件语句12-3

2021-10-17  本文已影响0人  小胡同学ime

条件语句

if条件语句:如果...就...,否则...

if(一个逻辑值){ 一段代码 } else { 一段代码 }
*若只有if没有else,那么条件是FALSE时就什么都不做

i = -1
if (i<0) print('up')
## [1] "up"

if (i>0) print('up')
#无返回值

if(!require(tidyr)) install.packages("tidyr")

(2)有else

i =1
if (i>0){
  cat('+')       #输出本来的样子+
} else {
  print("-")       #输出括号里面的内容“-”
}

ifelse 很重要

image.png
x=rnorm(10)
y=ifelse(x>0,"+","-")
y
 [1] "+" "-" "-" "-" "-" "-" "-" "+" "+" "-"

(3)多个条件

i = 0
if (i>0){
  print('+')
} else if (i==0) {
  print('0')
} else if (i< 0){
  print('-')
}
 [1] "0"

ifelse(i>0,"+",ifelse((i<0),"-","0"))
[1] "0"

也可以学习一下dyplr中的case_when函数

1. For循环

循环中括号建议写两个
顺便看一下next和break

*用x本身作为参数

x <- c(5,6,0,3)
s=0
for (i in x){    #x里面的i数据依次进入循环计算,四次结束
  s=s+i
  #if(i == 0) next   跳到下一个循环
  #if (i == 0) break 跳出整个循环
  print(c(which(x==i),i,1/i,s))
}
[1] 1.0 5.0 0.2 5.0
[1]  2.0000000  6.0000000  0.1666667 11.0000000
[1]   3   0 Inf  11
[1]  4.0000000  3.0000000  0.3333333 14.0000000

*用x的角标作为参数

x <- c(5,6,0,3)
s = 0      #数据的角标1:4
for (i in 1:length(x)){
  s=s+x[[i]]   ##  循环中 中括号建议写两个
  #if(i == 3) next
  #if (i == 3) break
  print(c(i,x[[i]],1/x[[i]],s))
}
[1] 1.0 5.0 0.2 5.0
[1]  2.0000000  6.0000000  0.1666667 11.0000000
[1]   3   0 Inf  11
[1]  4.0000000  3.0000000  0.3333333 14.0000000

如何将结果存下来?

s = 0
result = list()
for(i in 1:length(x)){
  s=s+x[[i]]
  result[[i]] = c(i,x[[i]],1/i,s)
}
> View(result)
image.png
do.call(cbind,result) #将结果中的元素按列排列成数据框

##      [,1] [,2]       [,3]  [,4]
## [1,]    1  2.0  3.0000000  4.00
## [2,]    5  6.0  0.0000000  3.00
## [3,]    1  0.5  0.3333333  0.25
## [4,]    5 11.0 11.0000000 14.00

练习6-3

注意最后aes()传参的问题

为什么for循环和aes八字不合

get()函数可以让字符变成变量名

1.使用循环,查看"a",TRUE和3的数据类型

m <- list("a", TRUE, 3)
for (i in 1:3) {
  class(m[[i]])
}
#2.生成10个随机数,根据这10个随机数生成一个新向量,>中位数的值对应"A",<中位数的值对应"B"。
m <- rnorm(10)
m1 <- ifelse(m>median(m), "A", "B");m1

##  [1] "A" "A" "B" "A" "B" "A" "B" "B" "B" "A"

#3.根据上一练习题中的tmp2生成一个新向量,含有e的值对应"A",不含有e的值对应"B"
tmp = "Bioinformatics is a new subject of genetic data collection,analysis and dissemination to the research community."
library(stringr)
tmp2 = tmp %>% 
  str_replace(","," ") %>%
  str_remove("[.]") %>% 
  str_split(" ")
tmp2 = tmp2[[1]]
ifelse(str_detect(tmp2, "e"), "A", "B")

##  [1] "B" "B" "B" "A" "A" "B" "A" "B" "A" "B" "B" "A" "B" "A" "A" "B"

#2.生成一个随机数(rnorm)组成的10行6列的矩阵,列名为sample1,sample2….sample6,
# 行名为gene1,gene2…gene10,
# 分组为sample1、2、3属于A组,sample4、5、6属于B组。
# 用循环对每个基因画ggplot2箱线图。
set.seed(2020)
library(dplyr)

## 
## Attaching package: 'dplyr'

## The following objects are masked from 'package:stats':
## 
##     filter, lag

## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

library(tidyr)
library(ggplot2)
library(cowplot)

## 
## ********************************************************

## Note: As of version 1.0.0, cowplot does not change the

##   default ggplot2 theme anymore. To recover the previous

##   behavior, execute:
##   theme_set(theme_cowplot())

## ********************************************************

library(patchwork)

## 
## Attaching package: 'patchwork'

## The following object is masked from 'package:cowplot':
## 
##     align_plots

exp = matrix(rnorm(60),nrow = 10)
colnames(exp) <- paste0("sample",1:6)
rownames(exp) <- paste0("gene",1:10)
exp[1:4,1:4]

##          sample1    sample2     sample3    sample4
## gene1  0.3769721 -0.8531228  2.17436525 -0.8125047
## gene2  0.3015484  0.9092592  1.09818265 -0.7437022
## gene3 -1.0980232  1.1963730  0.31822032  1.0953451
## gene4 -1.1304059 -0.3715839 -0.07314756  2.4353737

dat = data.frame(t(exp))
dat = mutate(dat,group = rep(c("A","B"),each = 3))%>% mutate(pair = rep(c("AA","BB","cc"),each = 2))

dat2 = gather(dat,key = "gene",value = "expression",-group,-pair)
ggplot(data = dat2)+
  geom_boxplot(aes(x = group,y = expression,color = group))+
  theme_bw()+
  facet_wrap(~gene,nrow = 2)

image
p <- list()
for (i in colnames(dat)[1:10]) {
  p[[which(colnames(dat)==i)]] = ggplot(data = dat, 
                   aes(x = group,y = !!dat[,i], color = group))+
    geom_boxplot()+
    ylab(paste0("Expression of ", i))
}

wrap_plots(p,nrow=2,guides = 'collect')

image

2.while 循环

image.png

不会自己停,需要达到你给出的条件才会停止,很少应用

i = 0
while (i < 5){
  print(c(i,i^2))
  i = i+1
}
## [1] 0 0
## [1] 1 1
## [1] 2 4
## [1] 3 9
## [1]  4 16

3.repeat 语句

注意:必须有break
i=0L
s=0L
repeat{
 i = i + 1
 s = s + i
 print(c(i,s))
 if(i==50) break
}
上一篇下一篇

猜你喜欢

热点阅读