R语言基础

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()  #用于删除指定的文件。

重点

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容