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
> # 有多个公共列时,需指出使用哪一列作为连接列