1.安装加载R包
1.1镜像设置
1.1.1CRAN镜像
随便选择一个看的顺眼的镜像,如果还是无法下载,看1.2
1.1.2在RStudio中设置
在Console中输入> file.edit('~/Rprofile')
,编辑R的配置文件
在代码区输入两行代码
# options函数是设置R运行过程中的一些选项设置
options("repos"=c(CRAN="https://mirrors.tuna.tsinghua.edu.cn/CRAN/")) #基础R包国内源
options(BioC_mirror="https://mirrors.ustc.edu.cn/bioc/") #Bioconductor国内源
点击【run】再保存文件,重启RStudio
检验是否设置成功
> options()$BioC_mirror
[1] "https://mirrors.ustc.edu.cn/bioc/" #BioC_mirror设置成功
> options()$repos
CRAN
"https://mirrors.tuna.tsinghua.edu.cn/CRAN/" #基础R包设置成功
如设置不成功会显示“Null”
1.2安装R包
1.2.1R包查找
CRAN Task Views官网中寻找需要的包,官网可以在RStudio中查找
与医学相关的主题是【Genetics】,【Bioconductor】比较常用,也是软件开发者写的R包
1.2.2R包安装
直接在Console区输入install packages("software")
,将软件安装在默认的目录下,方便调动。
大多数R包都可以在线安装,并且自动安装需要的依赖包。
1.3R包的使用
> .libPaths() #显示库所在的位置
[1] "C:/Users/12764/Documents/R/win-library/4.0"
[2] "D:/Program Files/R-4.0.2/library"
> library() #在代码区显示已安装的软件包
> library(vcd) #加载名为vcd的R包
载入需要的程辑包:grid
Warning message:
程辑包‘vcd’是用R版本4.0.4 来建造的
> require(vcd) #作用于Libary(vcd)一样
> help(package="vcd") #查看使用帮助
> ls("package:vcd") #列出R包中所包含的函数
> data(package="vcd") #列出R包中包含的数据集
> detach("package:vcd") #移出已加载的VCD,想要再使用须重新加载
> remove.packages("vcd") #删除软件包
1.4R包的批量移植
在新设备上使用原有R包
> installed.packages() #显示已安装包
> installed.packages()[,1] #访问数据框第一列
> Rpack <- installed.packages()[,1] #将所有R包名字保存在Rpack中
> save(Rpack,file="Rpack.Rdata") #保存Rpack
#将该文件移到另一台设备并使用load函数打开,存到另一个变量Rpack中
> for (i in Rpack) install.packages(i) #批量安装,如已安装则会自动跳过
2.数据转换-dplyr
dplyr 函数不修改输入,如果想要保存函数结果,需要使用赋值操作符 <-
> iris #以此数据框为例
Sepal.Length Sepal.Width Petal.Length Petal.Width Species #表头(150行数据略)
2.1五个基础函数
这五个函数都可以和 group_by() 函数联合起来使用,group_by() 函数可以改变以上每个函数
的作用范围,让其从在整个数据集上操作变为在每个分组上分别操作。
这五个函数的工作方式相同,都是:
(1) 第一个参数是一个数据框。
(2) 随后的参数使用变量名称(不带引号)描述了在数据框上进行的操作。
(3) 输出结果是一个新数据框。
2.1.1使用select()选择列
(1)按列号筛选
> select(iris,1) #显示第一列
Sepal.Length #(150行数据略)
> select(iris,c(1,5)) #显示第一列、第5列
Sepal.Length Species #(150行数据略)
(2)按列名搜索
> select(iris,Sepal.Length) #显示Sepa.Length列
Sepal.Length #(150行数据略)
> select(iris,Petal.Length,Petal.Width) #显示Petal.Length和Petal.Width这两列
Petal.Length Petal.Width#(150行数据略)
> vars <- c("Petal.Length","Petal.Width")
> select(iris,one_of(vars)) #on_of用来声明选择对象
Petal.Length Petal.Width #(150行数据略)
2.1.2使用filter()筛选行
filter() 函数可以基于观测的值筛选出一个观测子集。
- 第一个参数是数据框名称
- 第二个参数以及随后的参数是用来筛选数据框的表达式。
filter() 中的多个参数是由“与”组合起来的:每个表达式都必须为真才能让一行观测包含在输出中。
- & 表示“与”
- | 表示“或”
- ! 表示“非”
- x %in% y。选取出 x 是 y 中的一个值时的所有行。
filter() 只能筛选出条件为 TRUE 的行;它会排除那些条件为 FALSE 和 NA 的行。
如果想保留缺失值,可以明确指出
> dplyr::filter(iris,Sepal.Length>7) #过滤掉Sepal长度<7的数据
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 7.1 3.0 5.9 2.1 virginica
2 7.6 3.0 6.6 2.1 virginica
3 7.3 2.9 6.3 1.8 virginica
4 7.2 3.6 6.1 2.5 virginica
5 7.7 3.8 6.7 2.2 virginica
6 7.7 2.6 6.9 2.3 virginica
7 7.7 2.8 6.7 2.0 virginica
8 7.2 3.2 6.0 1.8 virginica
9 7.2 3.0 5.8 1.6 virginica
10 7.4 2.8 6.1 1.9 virginica
11 7.9 3.8 6.4 2.0 virginica
12 7.7 3.0 6.1 2.3 virginica
> filter(iris,Species=="setosa") #选择含有setosa的行
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa #(以下略48行)
> filter(iris,Species=="setosa"&Sepal.Length>5.5) #选择Sepal.Length>5的列中含有setosa的行
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.8 4.0 1.2 0.2 setosa
2 5.7 4.4 1.5 0.4 setosa
3 5.7 3.8 1.7 0.3 setosa
> filter(iris,Sepal.Length==5.5|Sepal.Length==5.2) #选择Sepal.Length等于5.5或5.2的行
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.2 3.5 1.5 0.2 setosa
2 5.2 3.4 1.4 0.2 setosa
3 5.2 4.1 1.5 0.1 setosa
4 5.5 4.2 1.4 0.2 setosa
5 5.5 3.5 1.3 0.2 setosa
6 5.5 2.3 4.0 1.3 versicolor
7 5.2 2.7 3.9 1.4 versicolor
8 5.5 2.4 3.8 1.1 versicolor
9 5.5 2.4 3.7 1.0 versicolor
10 5.5 2.5 4.0 1.3 versicolor
11 5.5 2.6 4.4 1.2 versicolor
> filter(iris,Species %in% c("setosa","versicolor")) #选择包含有setosa和versicolor的行
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa #(以下略77行)
79 6.0 2.9 4.5 1.5 versicolor #(以下略21行)
2.1.3使用arrange()排列行
arrange() 函数的工作方式与 filter() 函数非常相似,但不是选择行,而是改变行的顺序。
接受一个数据框和一组作为排序依据的列名(或者更复杂的表达式)作为参数。
如果列名不只一个,使用后面的列在前面排序的基础上继续排序:
> dplyr::arrange(iris,Sepal.Length) #按照Sepal的长度从小到大排序
> dplyr::arrange(iris,desc(Sepal.Length)) #按照Sepal的长度从大到小排序
> dplyr::arrange(iris,-Sepal.Length) #按照Sepal的长度从大到小排序
> arrange(iris,Sepal.Length,Petal.Width) #在按照Sepal的长度从小到大排序的前提下,按照Petal宽度从小到大排序
2.1.4使用summarise()进行分组摘要
可以将数据框折叠成一行
> summarise(iris,avg=mean(Sepal.Length)) #计算平均长度
avg
1 5.843333
> summarise(iris,sum=sum(Sepal.Length)) #计算总长度
sum
1 876.5
> summarise(iris,mean(Sepal.Length),sd(Sepal.Length)) # 计算Sepal.Length的平均值和标准差
mean(Sepal.Length) sd(Sepal.Length)
1 5.843333 0.8280661
与group_by()一起使用会起大作用
group_by() 和 summarize() 的组合构成了使用 dplyr 包时最常用的操作之一:分组摘要。
> group_by(iris,Species) # 按照Species分组,计算每组Sepal.Length的平均值和标准差
1 # A tibble: 150 x 5
2 # Groups: Species [3]
3 Sepal.Length Sepal.Width Petal.Length Petal.Width Species
4 <dbl> <dbl> <dbl> <dbl> <fct>
5 1 5.1 3.5 1.4 0.2 setosa
6 2 4.9 3 1.4 0.2 setosa
7 3 4.7 3.2 1.3 0.2 setosa
8 4 4.6 3.1 1.5 0.2 setosa
9 5 5 3.6 1.4 0.2 setosa
10 6 5.4 3.9 1.7 0.4 setosa
11 7 4.6 3.4 1.4 0.3 setosa
12 8 5 3.4 1.5 0.2 setosa
13 9 4.4 2.9 1.4 0.2 setosa
14 10 4.9 3.1 1.5 0.1 setosa
15 # ... with 140 more rows
#以上1-15行均为结果输出
> summarise(group_by(iris,Species),mean(Sepal.Length),sd(Sepal.Length)) # 先按照Species分组,计算每组Sepal.Length的平均值和标准差
1 # A tibble: 3 x 3
2 Species `mean(Sepal.Length)` `sd(Sepal.Length)`
3 <fct> <dbl> <dbl>
4 1 setosa 5.01 0.352
5 2 versicolor 5.94 0.516
6 3 virginica 6.59 0.636
#以上1-6行均为结果输出
2.1.5使用mutate()添加新变量
mutate() 默认将新列添加在数据集的最后
> dplyr::mutate(iris,new=Sepal.Length+Petal.Length)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species new
1 5.1 3.5 1.4 0.2 setosa 6.5 #(以下略149行)
2.2dplyr两个实用技能
2.2.1管道操作 %>% (cmd/ctr + shift + M)
链式操作符%>%:用于实现将一个函数的输出传递给下一个函数,作为下一个函数的输入
这种方法的重点在于转换的过程,而不是转换的对象,这使得代码具有更好的可读性。
在阅读代码时,%>%最好读作“然后”。
加载任意一个tidyverse包即可用管道符号
> head(mtcars,20) %>% tail(10) #取出mtcars的前20行,然后再在取出的前20行中取后10行(取mtcars的11-20行)
> iris %>% group_by(Species)
> dplyr::group_by(iris,Species)
#上两个函数都是对Species进行分组
> iris %>% group_by(Species) %>% summarise() #分组统计
# A tibble: 3 x 1
Species
<fct>
1 setosa
2 versicolor
3 virginica
> iris %>% group_by(Species) %>% summarise(avg=mean(Sepal.Width)) #分组统计并取平均值
# A tibble: 3 x 2
Species avg
<fct> <dbl>
1 setosa 3.43
2 versicolor 2.77
3 virginica 2.97
> iris %>% group_by(Species) %>% summarise(avg=mean(Sepal.Width)) %>% arrange(avg) #分组统计取平均值并排序
# A tibble: 3 x 2
Species avg
<fct> <dbl>
1 versicolor 2.77
2 virginica 2.97
3 setosa 3.43
2.2.2count统计某列的unique值
> count(iris,Species)
Species n
1 setosa 50
2 versicolor 50
3 virginica 50
2.3dplyr处理关系数据
关系数据最常见于关系数据库管理系统(relational database management system,RDBMS),该系统几乎囊括了所有的现代数据库。
dplyr 比 SQL 更容易使用,因为前者专门用于进行数据分析。
有颜色的列表示作为“键”的变量:它们用于在表间匹配行。
灰色列表示“值”列,是与键对应的值。
连接是将 x 中每行连接到 y 中 0 行、一行或多行的一种方法。
匹配在实际的连接操作中是用圆点表示的。圆点的数量 = 匹配的数量 = 结果中行的数量。
#创建a和b两个表格
> a <- data.frame(x1=c("A","B","C"),x2=c(1,2,3),stringsAsFactors = F)
> b <- data.frame(x1=c("A","B","D"),x3=c(T,F,T),stringsAsFactors = F)
> a
x1 x2
1 A 1
2 B 2
3 C 3
> b
x1 x3
1 A TRUE
2 B FALSE
3 D TRUE
2.3.1内连接inner_jin
取交集
> dplyr::inner_join(a,b,by="x1")
x1 x2 x3
1 A 1 TRUE
2 B 2 FALSE
2.3.2外连接
保留至少存在于一个表中的观测。
外连接有 3 种类型:
a. 左连接:保留 x 中的所有观测。
b. 右连接:保留 y 中的所有观测
c. 全连接:保留 x 和 y 中的所有观测。
这些连接会向每个表中添加额外的“虚拟”观测,这个观测拥有总是匹配的键(如果没有其他键可匹配的话),其值则用 NA 来填充。
a. 左连left_join
> dplyr::left_join(a,b,by="x1")
x1 x2 x3
1 A 1 TRUE
2 B 2 FALSE
3 C 3 NA
> dplyr::left_join(b,a,by="x1")
x1 x3 x2
1 A TRUE 1
2 B FALSE 2
3 D TRUE NA
b. 右连接right_join
> dplyr::right_join(a,b,by="x1")
x1 x2 x3
1 A 1 TRUE
2 B 2 FALSE
3 D NA TRUE
> dplyr::right_join(b,a,by="x1")
x1 x3 x2
1 A TRUE 1
2 B FALSE 2
3 C NA 3
c. 全连接full_join
> dplyr::full_join(a,b,by="x1")
x1 x2 x3
1 A 1 TRUE
2 B 2 FALSE
3 C 3 NA
4 D NA TRUE
2.3.3筛选连接
筛选连接匹配观测的方式与合并连接相同,但影响的是观测,而不是变量。
筛选连接有两种类型:
a. semi_join(x, y):返回能够与y表匹配的x表所有记录
b. anti_join(x, y):返回无法与y表匹配的x表的所记录
a. 半连接:保留 x 表中与 y 表中的观测相匹配的所有观测
> dplyr::semi_join(a,b,by="x1")
x1 x2
1 A 1
2 B 2
b. 反连接:丢弃 x 表中与 y 表中的观测相匹配的所有观测
> dplyr::anti_join(a,b,by="x1")
x1 x2
1 C 3
参考:
花花的课件
《R数据科学》
视频《R语言入门与数据分析》p11 p12 p40