虽然前期陆陆续续间断学习用过R,当时感觉自己现在每次用R又要花很多时间重新理解R的语言逻辑,所以想系统学习下R语言,主要记录下自己的R的学习过程,做下笔记加深印象。
R及Rstudio安装
因为我用R主要用于生信下游的数据分析整理及数据的可视化(画图),这里主要介绍win系统下的R和R语言集成开发环境Rstudio的安装及更新,就不涉及linux系统的的安装了。
1.首次安装
1.先去官网下载R语言:
2.下载安装完成之后,直接按平常安装软件按默认设置安装R就行。
3.R安装完成再进行R的集成开发环境Rstudio的下载安装
4.同样的,正常安装,安装完成后打开Rstudio软件自动识别到R语言,要稍微进行相关设置,如文本编码格式,R包的下载镜像等。在菜单栏的Tools--Global Options里进行设置
2.更新
重新卸载安装
认识R语言及初步使用
R语言是一种高级的编程语言,拥有强大的数据处理能力以及出色的数据可视化能力,我这里主要基于genek的课程学习,进行的学习笔记记录,看下来还是比较能满足我的需求。R语言使用依次涉及4个方面:数据的输入,数据的分析,可视化,以及结果输出。
1.数据输入
可以直接进行外界数据的写入:read.table()
和read.excel()
;或者直接在页面点击Import Dataset进行数据集导入,注意设置行/列标题(header / row.names)及分隔符(sep)
df <- read.table(file = "data/genes.TMM.EXPR.matrix", #大家习惯赋值给df,dataframe的缩写
sep = "\t", #设置分割符为制表符
header = T, #设置有列标题
row.names = 1) #设置有行标题
我们上面输入的是一个数据框,有行有列,这是个2维数据,下面介绍下其他的数据结构:
-
标量,0维数据,事实上R语言里没有0维数据,后面会具体说
单个数值即为标量(scalar),如s=1;
注意R语言里的原子数据(最小数据结构)是向量,所以a=1等同于a=c(1),事实上也就不存在标量;
另外,R语言的赋值为<-
,但这等同于其他编程语言里的=
-
向量,1维数据
一列数据即为向量(vector),如v = c(1, 2, 3, 4) -
数据框,2维数据
有行和列,多组向量组成数据框,不同向量的数据类型可能不一样,如:
df = data.frame(row.names = c("张三", "李四", "王五", "赵六", "田七"),
性别 = c("男","女","男","女","男"),
年龄 = c(55, 22, 16, 66, 78),
成绩 = c(56, 16, 80, 100, 24)
)
二维数据框是由一维数据向量构成的,向量这个最小数据结构,他的数据类型又是什么呢,有以下几种数据类型:
数值型,num(Numeric),v1 = 1:4,数值型包括整数型和浮点型
整数型,int(Integer),v = c(1, 2, 3, 4)
浮点型,dbl(double),v = c(sqrt(2), sqrt(3), sqrt(5))
字符型,chr(Character)或 str (String,字符串), v = c("张三", "李四", "王五", "赵六")
逻辑型,logi(Logical),v = c(T, T, F, F)
2.数据分析
数据导入之后即可对数据进行各种处理操作,来达到可进行可视化的数据状态。包括如下分析:
-
简单计算,通过
+ - * /
等单个操作符既可以完成的简单计算; -
函数,通过
sum()``min
等函数完成的计算; - R包,通过安装各种R号,调用R包里的各种函数进行计算;
-
流程控制
-- 线性
-- 循环,如for()
、while()
-- 条件,如if... else...
3.可视化
-
基于base R传统图像系统,传统的图像系统是由
graphics
包所提供的一系列函数组成; -
grid 绘图体系,grid 系统是
grid
包提供,ggplot2
顶层绘图包是基于grid系统的;
4.结果输出
- 数据输出
write.table(data_frame, file = "ouputDir/DEGs.csv", #括号内:变量数据名 + 输出路径及文件名
sep = "\t") #指定分隔符为制表符,其他分割符: 分号";" 制表符"\t" 空白" " 竖线"|" 逗号","
--------------
write.csv(data_frame, file = "ouputDir/DEGs.csv") #write.csv默认分隔符为逗号
- 图像输出
pdf(file = "outputDir/plot.pdf") #创建一个空白pdf:plot.pdf
pheatmap(data_frame) #基于data_frame数据绘制一个热图
dev.off #停止绘制,可以被理解为 "device off",即关闭设备(停止图像绘制)的意思
关于数据结构
这里稍微展开学习下R语言里的数据结构,前面说了R语言有2种数据结构,分别是向量和数据框。这里主要学习下这两种数据结构的创建和取值。
在这之前先说下R语言中是没有“标量”这种数据结构的,因为在在R中输入如下判断会得到正确回答,说明R语言中创建标量的时候会自动把标量作为向量来看,即将s = 1
当作s = c(1)
> s = 1 #创建一个标量
> v = c(1) #创建一个向量
> s == v #判断这两个数据是否相等
[1] TRUE
--创建向量
创建向量就是把一串数据把他塞到一个集合combine里的过程。以下是创建向量数据的几种方式,如普通创建(使用函数c()
)、使用运算符、运算符:
v1 = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) #普通创建
v1 = 1:10 #使用运算符,冒号代表连续证书
v2 = seq(0,10,2) #使用函数,seq() 用于生成等差数列,步长为2
v2 = seq(c(0),c(10),2)
v3 = rep(1:3,3) #重复函数
v3 = rep(c(1,2,3), 3)
--对向量取值
从一个向量里取出数据的过程,可以1个也可以多个。以下是几种在向量中取值的方式:1.按位置、2.按名称、3.按逻辑
###按位置
> v3 = rep(1:3,3) #创建向量v3
> v3[5] #取向量v3里的第5个值
[1] 2
> v3[c(5,6,7)] #取向量v3里的第5、第6、第7个值
[1] 2 3 1
###按名称
v4 = c(1, 2, 3, 4) #创建向量v4
names(v4) <- c("你好", "我好", "他好", "大家好") #使用names()对向量v4进行命名
> v4["他好"]
他好
3
> v4[3]
他好
3
> v4[c("你好", "他好")]
你好 他好
1 3
> v4[c(1,3)]
你好 他好
1 3
> v4[1:3]
你好 我好 他好
1 2 3
###按逻辑
> v4 > 2
你好 我好 他好 大家好
FALSE FALSE TRUE TRUE
> v4[c(F,F,T,T)]
他好 大家好
3 4
> v4[v4 > 2]
他好 大家好
3 4
++创建数据框
创建数据框就是将多列向量组合成一个2维数据框,每一列是都是一个向量,向量的数据类型可以不同。可以通过函数data.frame()
进行创建,但更常见的是通过导入表格数据来创建read.table()
和read.excel()
:
#使用data.frame()创建数据框
df = data.frame(row.names = c("张三", "李四", "王五", "赵六", "田七"), #首先定义行名
性别 = c("男","女","男","女","男"), #第一列,向量类型为字符型,列名/向量名 = c()
年龄 = c(55, 22, 16, 66, 78), #第二列,向量类型为数值型,列名/向量名 = c()
成绩 = c(56, 16, 80, 100, 24) #第三列,向量类型为数值型,列名/向量名 = c()
)
> df
性别 年龄 成绩
张三 男 55 56
李四 女 22 16
王五 男 16 80
赵六 女 66 100
田七 男 78 24
#使用read.table()创建数据框
genes.EXPR1 <- read.table(file = "data/genes.TMM.EXPR.matrix",
sep = "\t",
header = T,
row.names = 1)
++对数据框取值
不同于向量,数据框是2维数据,因此需要确定“行”和“列”两个条件: 。同样也是三种方式:1.按位置, df[行号,列号]
;2.按名称,df["行名","列名"]
;3.按逻辑,对列进行筛选df[逻辑向量,]
###按位置
> df[2, 3]
[1] 16
> df[c(2,3),c(2,3)]
年龄 成绩
李四 22 16
王五 16 80
> df[2:3,2:3]
年龄 成绩
李四 22 16
王五 16 80
###按名称
> df["李四", "成绩"]
[1] 16
> df[c("李四","王五"), c("年龄","成绩")]
年龄 成绩
李四 22 16
王五 16 80
> df[2:3, c("年龄","成绩")]
年龄 成绩
李四 22 16
王五 16 80
###按逻辑
> df[df$成绩 > 60,]
性别 年龄 成绩
王五 男 16 80
赵六 女 66 100
关于数据类型
向量的数据类型,前面也说了,主要包括:数值型、字符型、逻辑型。这里记下每种数据类型的几种常见操作:
数值型,num(Numeric)
###还是用df数据框举例
df = data.frame(row.names = c("张三", "李四", "王五", "赵六", "田七"),
性别 = c("男","女","男","女","男"),
年龄 = c(55, 22, 16, 66, 78),
成绩 = c(56, 16, 80, 100, 24)
)
> df
性别 年龄 成绩
张三 男 55 56
李四 女 22 16
王五 男 16 80
赵六 女 66 100
田七 男 78 24
> class(df$性别)
[1] "character"
> class(df$年龄)
[1] "numeric"
> class(df$成绩)
[1] "numeric"
> df$成绩 > 60
[1] FALSE FALSE TRUE TRUE FALSE
> df$成绩 + 10
[1] 66 26 90 110 34
> df$成绩 * 2
[1] 112 32 160 200 48
> df$成绩 %/% 10 #整除取整
[1] 5 1 8 10 2
> df$成绩 %% 10 #整除取余
[1] 6 6 0 0 4
> mean(df$成绩)
[1] 55.2
-
字符型,chr(Character)或 str (String,字符串)
对字符串进行操作常用到stringr
软件包,tidyverse
包括了这个
s = c("a", "T", "CccTGG", "gGGttAA", "TTttttAAAaaaCCC") #创建字符型向量
library(stringr) #加载stringr包
> str_to_upper(s) #str_to_upper()函数
[1] "A" "T" "CCCTGG" "GGGTTAA" "TTTTTTAAAAAACCC"
> str_to_lower(s) #str_to_lower()函数
[1] "a" "t" "ccctgg" "gggttaa" "ttttttaaaaaaccc"
> str_count(s,"t") #str_count()函数
[1] 0 0 0 2 4
> str_count(str_to_lower(s),"t")
[1] 0 1 1 2 6
> str_replace(str_to_upper(s),"T", "U") #str_replace()函数
[1] "A" "U" "CCCUGG" "GGGUTAA" "UTTTTTAAAAAACCC"
> str_replace_all(str_to_upper(s),"T", "U")
[1] "A" "U" "CCCUGG" "GGGUUAA" "UUUUUUAAAAAACCC"
- 逻辑型,logi(Logical),v = c(T, T, F, F)