学习小组Day6笔记-意尔

1.安装加载R包

1.1镜像设置

1.1.1CRAN镜像

tools.png

![Packages.png](https://upload-images.jianshu.io/upload_images/26046911-f0acb27d90d73915.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

镜像.png

随便选择一个看的顺眼的镜像,如果还是无法下载,看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中查找

CRANTaskViews.jpg

与医学相关的主题是【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 行、一行或多行的一种方法。
匹配在实际的连接操作中是用圆点表示的。圆点的数量 = 匹配的数量 = 结果中行的数量。


连接-韦恩图.jpg
#创建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

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

推荐阅读更多精彩内容