学习小组54期 6th day-R package--忍冬

2020-04-22

今日内容:

学习R包
“R包使用是一通百通”--突然之间有了信心

以dplyr为例,讲一下R包

  1. 安装和加载R包
    1.1 镜像设置

你还在每次配置Rstudio的下载镜像吗?

 1.1.1 之前按教程设置过清华cran镜像的局限性

cran清华大学的镜像设置

但是:如果要下载Bioconductor的包,这个镜像是没有办法用的;另外即使设置了这里,Rstudio也不是每次都能真的从CRAN去下载包,可以通过options()$repos来检验,很多时候还是无奈地回到了R的国外官网

#`options`函数就是设置R运行过程中的一些选项设置
options("repos" = c(CRAN="https://mirrors.tuna.tsinghua.edu.cn/CRAN/")) #对应清华源
options(BioC_mirror="https://mirrors.ustc.edu.cn/bioc/") #对应中科大源
# 当然可以换成其他地区的镜像

 1.1.2 但是这种方法还可能有问题

下次再打开Rstudio会发现,下载Bioconductor还是会回到官方镜像,可以查询options()$BioC_mirror 试试,如果依然是自己设置的国内镜像,就不用管了;如果发现需要再重新运行一遍代码进行设置,那么就需要继续看下面的内容

 1.1.3 这里就需要用到R的配置文件 .Rprofile

Rstudio最重要的两个配置文件:.Renviron--它是为了设置R的环境变量(这里先不说它);而.Rprofile是一个代码文件,如果启动时找到这个文件,那么先运行一遍(这个过程就是在启动Rstudio时完成的)
这个文件的配置可以多样(比如linux中在.bashrc文件中添加alias 作为快捷命令)

首先用file.edit()来编辑文件

file.edit('~/.Rprofile')

然后在其中添加好上面的两行options代码

options("repos" = c(CRAN="https://mirrors.tuna.tsinghua.edu.cn/CRAN/")) #对应清华源
options(BioC_mirror="https://mirrors.ustc.edu.cn/bioc/") #对应中科大源

 1.2 安装
R包安装命令是install.packages(“包”)或者BiocManager::install(“包”)

取决于你要安装的包存在于CRAN网站还是Biocductor。具体位置需自行搜索。

 1.3 加载
library(包) require(包)
R语言中的数据处理包dplyr、tidyr笔记

已安装并加载好dplyr

 1.4 加载实例数据集以应用dplyr:

> test <- iris[c(1:2,51:52,101:102),]
> View(test)
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
51 7.0 3.2 4.7 1.4 versicolor
52 6.4 3.2 4.5 1.5 versicolor
101 6.3 3.3 6.0 2.5 virginica
102 5.8 2.7 5.1 1.9 virginica

dplyr: Single table verbs
Dplyr aims to provide a function for each basic verb of data manipulation:
filter()to select cases based on their values.
arrange() to reorder the cases.
select() and rename() to select variables based on their names.
mutate() and transmute() to add new variables that are functions of existing variables.
summarise() to condense multiple values to a single value.
sample_n() and sample_frac() to take random samples.

  • mutate()增加列数
    Add new columns with mutate()
    Besides selecting sets of existing columns, it’s often useful to add new columns that are functions of existing columns. This is the job of mutate():
mutate(flights,
  gain = arr_delay - dep_delay,
  speed = distance / air_time * 60
)


> mutate(test, new = Sepal.Length * Sepal.Width) #mutate() and transmute() to add new variables that are functions of existing variables.
  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species   new
1          5.1         3.5          1.4         0.2     setosa 17.85
2          4.9         3.0          1.4         0.2     setosa 14.70
3          7.0         3.2          4.7         1.4 versicolor 22.40
4          6.4         3.2          4.5         1.5 versicolor 20.48
5          6.3         3.3          6.0         2.5  virginica 20.79
6          5.8         2.7          5.1         1.9  virginica 15.66
  • select(),按列号筛选
> select(test,1)
    Sepal.Length
1            5.1
2            4.9
51           7.0
52           6.4
101          6.3
102          5.8
> select(test,c(1,5))
    Sepal.Length    Species
1            5.1     setosa
2            4.9     setosa
51           7.0 versicolor
52           6.4 versicolor
101          6.3  virginica
102          5.8  virginica
  • select(),按列名筛选
 select(test,Sepal.Width,Petal.Width)
    Sepal.Width Petal.Width
1           3.5         0.2
2           3.0         0.2
51          3.2         1.4
52          3.2         1.5
101         3.3         2.5
102         2.7         1.9
> select(test, one_of(vars))       #one_of是个特殊的函数,不能单独使用,出自tidyselect,只能和select连用。
    Petal.Width    Species
1           0.2     setosa
2           0.2     setosa
51          1.4 versicolor
52          1.5 versicolor
101         2.5  virginica
102         1.9  virginica
  • filter(),筛选行 based on their values
> filter(test,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
> filter(test,Species=="setosa"&Sepal.Width>3.2)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa

# %in%用法    

     
a %in% table     #a值是否包含于table中,为真输出TURE,否者输出FALSE
#首先复制两个变量a和b
>a <- 1:5
>b <- 3:7
>a %in% b    #看a的元素是否包含版在b中输出结权果如下:
[1] FALSE FALSE  TRUE  TRUE  TRUE

> filter(test,Species %in% c("setosa","virginica"))    #species
  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
3          6.3         3.3          6.0         2.5 virginica
4          5.8         2.7          5.1         1.9 virginica
> filter(test,Species==c("setosa","virginica"))
  Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
1          5.1         3.5          1.4         0.2    setosa
2          5.8         2.7          5.1         1.9 virginica
  • arrange(),按某1列或某几列对整个表格进行排序
> arrange(test,Sepal.Width) #默认从小到大排序
  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1          5.8         2.7          5.1         1.9  virginica
2          4.9         3.0          1.4         0.2     setosa
3          7.0         3.2          4.7         1.4 versicolor
4          6.4         3.2          4.5         1.5 versicolor
5          6.3         3.3          6.0         2.5  virginica
6          5.1         3.5          1.4         0.2     setosa
> arrange(test, desc(Sepal.Width)) #用desc从大到小 
  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1          5.1         3.5          1.4         0.2     setosa
2          6.3         3.3          6.0         2.5  virginica
3          7.0         3.2          4.7         1.4 versicolor
4          6.4         3.2          4.5         1.5 versicolor
5          4.9         3.0          1.4         0.2     setosa
6          5.8         2.7          5.1         1.9  virginica```

%in%很简单

  • summarise():汇总(value)

结合group_by使用实用性强

> summarize(test,mean(Sepal.Width),sd(Sepal.Width)) # 计算Sepal.W的平均值和标准差
  mean(Sepal.Width) sd(Sepal.Width)
1              3.15       0.2738613
# 先按照Species分组,计算每组Sepal.W的平均值和标准差
> group_by(test,Species)
# A tibble: 6 x 5
# Groups:   Species [3]
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species   
*                                    
1          5.1         3.5          1.4         0.2 setosa    
2          4.9         3            1.4         0.2 setosa    
3          7           3.2          4.7         1.4 versicolor
4          6.4         3.2          4.5         1.5 versicolor
5          6.3         3.3          6           2.5 virginica 
6          5.8         2.7          5.1         1.9 virginica 
> summarise(group_by(test, Species),mean(Sepal.Width), sd(Sepal.Width))
# A tibble: 3 x 3
  Species    `mean(Sepal.Width)` `sd(Sepal.Width)`
                                   
1 setosa                    3.25             0.354
2 versicolor                3.2              0    
3 virginica                 3                0.424
  1. dplyr两个实用技能
    2.1 管道操作 %>% (cmd/ctr + shift + M)

加载任意一个tidyverse包即可用管道符号


https://blog.csdn.net/zhaozhn5/article/details/79001384

%>% 向右操作符(forward-pipe operator)
%>%是最常用的一个操作符,就是把左侧准备的数据或表达式,传递给右侧的函数调用或表达式进行运行,可以连续操作就像一个链条一样。
现实原理如上图所示,使用%>%把左侧的程序的数据集A传递右侧程序的B函数,B函数的结果数据集再向右侧传递给C函数,最后完成数据计算。

> test %>% 
+     group_by(Species) %>% 
+     summarise(mean(Sepal.Width), sd(Sepal.Width))
# A tibble: 3 x 3
  Species    `mean(Sepal.Width)` `sd(Sepal.Width)`
                                   
1 setosa                    3.25             0.354
2 versicolor                3.2              0    
3 virginica                 3                0.424

 2.2 count统计某列的unique值

 count(test,Species)
# A tibble: 3 x 2
  Species        n
        
1 setosa         2
2 versicolor     2
3 virginica      2
> count(test,Sepal.Width)
# A tibble: 5 x 2
  Sepal.Width     n
         
1         2.7     1
2         3       1
3         3.2     2
4         3.3     1
5         3.5     1
  1. dplyr处理关系数据

即:将2个表进行连接,注意:不要引入factor

> test1 <- data.frame(x = c('b','e','f','x'), 
+                     z = c("A","B","C",'D'),
+                     stringsAsFactors = F)
> test1
  x z
1 b A
2 e B
3 f C
4 x D
> View(test1)
> test2 <- data.frame(x = c('a','b','c','d','e','f'), 
+                     y = c(1,2,3,4,5,6),
+                     stringsAsFactors = F)
> test2 
  x y
1 a 1
2 b 2
3 c 3
4 d 4
5 e 5
6 f 6

 3.1 內连inner_join,取交集

> inner_join(test1, test2, by = "x")
  x z y
1 b A 2
2 e B 5
3 f C 6

 3.2 左连left_join,取交集

> left_join(test1,test2,by="x")
  x z  y
1 b A  2
2 e B  5
3 f C  6
4 x D NA
> left_join(test2,test1,by="x")
  x y    z
1 a 1 
2 b 2    A
3 c 3 
4 d 4 
5 e 5    B
6 f 6    C

 3.3 全连full_join,取合集

> full_join(test2,test1)
Joining, by = "x"
  x  y    z
1 a  1 
2 b  2    A
3 c  3 
4 d  4 
5 e  5    B
6 f  6    C
7 x NA    D

 3.4 半连接:返回能够与y表匹配的x表所有记录semi_join

> semi_join(x = test1, y = test2, by = 'x')
  x z
1 b A
2 e B
3 f C

 3.4 反连接:返回无法与y表匹配的x表的所记录anti_join

> anti_join(x=test2,y=test1,by="x")
  x y
1 a 1
2 c 3
3 d 4

 3.5 简单合并

> test3 <- data.frame(x = c(1,2,3,4), y = c(10,20,30,40))
> test4 <- data.frame(x = c(5,6), y = c(50,60))
> test5 <- data.frame(z = c(100,200,300,400))
> cbind(test3,test5)
  x  y   z
1 1 10 100
2 2 20 200
3 3 30 300
4 4 40 400
> bind_cols(test3,test5)
  x  y   z
1 1 10 100
2 2 20 200
3 3 30 300
4 4 40 400
> bind_rows(test4,test5)
   x  y   z
1  5 50  NA
2  6 60  NA
3 NA NA 100
4 NA NA 200
5 NA NA 300
6 NA NA 400

你可能感兴趣的:(学习小组54期 6th day-R package--忍冬)