R语言Merge函数应用举例

Merge函数是生信技能树生信爆款入门课程R语言部分的讲到的一个重要知识点。
为加深理解,现在找一个数据集做下练习巩固。

R语言merge函数 主要用来连接两个数据

官方参考文档语法

>merge(x, y, by = intersect(names(x), names(y)),
      by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
      sort = TRUE, suffixes = c(".x",".y"),
      incomparables = NULL, ...)
merge函数参数的说明:
>x,y 要合并的两个数据集
by,用于连接两个数据集的列,intersect(a,b)值向量a,b的交集,names(x)指提取数据集x的列名
by = intersect(names(x), names(y)) 是获取数据集x,y的列名后,提取其公共列名,作为两个数据集的连接列, 当有多个公共列时,需用下标指出公共列,如names(x)[1],指定x数据集的第1列作为公共列
也可以直接写为 by = ‘公共列名’ ,前提是两个数据集中都有该列名,并且大小写完全一致,R语言区分大小写
by.x,by.y:指定依据哪些行合并数据框,默认值为相同列名的列
all,all.x,all.y:指定x和y的行是否应该全在输出文件
sort:by指定的列(即公共列)是否要排序
suffixes:指定除by外相同列名的后缀
incomparables:指定by中哪些单元不进行合并

如何理解不同类型的合并

merge() 函数支持4种类型数据合并:
  
Natural join: 仅返回两数据框中匹配的数据框行,参数为:all=FALSE.

Full outer join: 返回两数据框中所有行, 参数为: all=TRUE.

Left outer join: 返回x数据框中所有行以及和y数据框中匹配的行,参数为: all.x=TRUE.

Right outer join: 返回y数据框中所有行以及和x数据框匹配的行,参数为: all.y=TRUE.

举例说明如下

读取并创建数据示例

> x <- iris[c(1,51),c(1,2,5)]
> x
   Sepal.Length Sepal.Width    Species
1           5.1         3.5     setosa
51          7.0         3.2 versicolor
> y <- iris[c(1,51,150),c(3,4,5)]
> y
    Petal.Length Petal.Width    Species
1            1.4         0.2     setosa
51           4.7         1.4 versicolor
150          5.1         1.8  virginica
> z <- iris[c(1,51,150),c(3,4,5)]
> colnames(z)[3] <- 'Species.name'
> z
    Petal.Length Petal.Width Species.name
1            1.4         0.2       setosa
51           4.7         1.4   versicolor
150          5.1         1.8    virginica
> w <- iris[c(1,51,150),c(2,3,4,5)]
> w
    Sepal.Width Petal.Length Petal.Width    Species
1           3.5          1.4         0.2     setosa
51          3.2          4.7         1.4 versicolor
150         3.0          5.1         1.8  virginica

查看数据集的列名称

> names(x)
[1] "Sepal.Length" "Sepal.Width"  "Species"     
> names(y)
[1] "Petal.Length" "Petal.Width"  "Species"     
> names(z)
[1] "Petal.Length" "Petal.Width"  "Species.name"
> names(w)
[1] "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     
可以看出两个数据集有公共列

1.根据Species列合并x,y数据框

> #提示: 当两个数据集均有连接列时,直接指定连接列的名称
> merge(x,y,by = 'Species') 
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa          5.1         3.5          1.4         0.2
2 versicolor          7.0         3.2          4.7         1.4

2根据Species列和Species.name合并y,z数据框

> # 提示:当两个数据集连接列名称不同时,直接用 by.x, by.y 指定连接列  
> merge(y,z,by.x = 'Species', by.y = 'Species.name') 
     Species Petal.Length.x Petal.Width.x Petal.Length.y Petal.Width.y
1     setosa            1.4           0.2            1.4           0.2
2 versicolor            4.7           1.4            4.7           1.4
3  virginica            5.1           1.8            5.1           1.8

3.将x,y两张表的数据合并,表中原来没有的数据置为空

> #提示:outer 模式,
> merge(x, y, all=TRUE, sort=TRUE) 
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa          5.1         3.5          1.4         0.2
2 versicolor          7.0         3.2          4.7         1.4
3  virginica           NA          NA          5.1         1.8

4.合并x,y数据框,并保留y全部值,和x中匹配的值。

> merge(x ,y ,by = 'Species', all.y=TRUE) 
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa          5.1         3.5          1.4         0.2
2 versicolor          7.0         3.2          4.7         1.4
3  virginica           NA          NA          5.1         1.8
> #提示right 匹配模式,并保留x全部值和y中匹配的值。

5.合并x,y数据框,并保留x全部值

> merge(x ,y ,by = 'Species',  all.x=TRUE) 
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa          5.1         3.5          1.4         0.2
2 versicolor          7.0         3.2          4.7         1.4
> #提示left 匹配模式

6.将x,y两张表的数据合并,并去掉合并后数值为NA的值。

> #提示:ncomparables = NA
> merge(x, y, incomparables = NA) 
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa          5.1         3.5          1.4         0.2
2 versicolor          7.0         3.2          4.7         1.4

7.根据Sepal.Width列合并x,W数据框,保留W全部值,并Sepal.Width排序

> merge(x ,w ,by.x= 'Sepal.Width', by.y= 'Sepal.Width',all.y=TRUE,sort = TRUE) 
  Sepal.Width Sepal.Length  Species.x Petal.Length Petal.Width  Species.y
1         3.0           NA       <NA>          5.1         1.8  virginica
2         3.2          7.0 versicolor          4.7         1.4 versicolor
3         3.5          5.1     setosa          1.4         0.2     setosa
> #提示right 匹配模式,并保留x全部值

8.合并x,y数据框。仅返回两数据框中匹配的数据框行

> merge(x, y, all = FALSE) 
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa          5.1         3.5          1.4         0.2
2 versicolor          7.0         3.2          4.7         1.4
> #提示,Natural join,参数为:all=FALSE。

9.合并x,y数据框。返回两数据框中所有行。

 merge(x, y, all = TRUE) 
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa          5.1         3.5          1.4         0.2
2 versicolor          7.0         3.2          4.7         1.4
3  virginica           NA          NA          5.1         1.8
> ##提示:Full outer join: , 参数为: all=TRUE。

10.根据Species列合并x,w数据框

 merge(x,w,by = intersect(names(x),names(w))[2])
     Species Sepal.Length Sepal.Width.x Sepal.Width.y Petal.Length Petal.Width
1     setosa          5.1           3.5           3.5          1.4         0.2
2 versicolor          7.0           3.2           3.2          4.7         1.4
> # 有多个公共列时,需指出使用哪一列作为连接列
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容