有时候两个数据框并没有很好地保持一致,不能简单地使用cbind()和rbind()函数,所以他们需要一个共同的列(common key)作为细胞融合的依据。最常用的内置函数为merge()和dplyr()包中的*_join(系列函数。
优势在于对于不同的数据框,可以指定不同的匹配列名;缺点再于运行速度较慢,其中by.x指定左边数据框匹配列,by.y指定右边数据框匹配列。
> df1<-data.frame(x=c("a","b","c"),y=1:3)
> df2<-data.frame(x=c("a","b","d"),z=c(2,5,3))
> df3<-data.frame(g=c("a","b","d"),z=c(2,5,3))
> df4<-data.frame(x=c("a","b","d"),y=c(1,4,2),z=c(2,5,3))
> d_m1<-merge(df1,df2,by="x",all=TURE)
d_m1<-merge(df1,df2,by="x",all=TRUE)
> d_m1
x y z
1 a 1 2
2 b 2 5
3 c 3 NA
4 d NA 3
> d_m1<-merge(df1,df2,by="x",all=FALSE) #有缺损的被去掉了
> d_m1
x y z
1 a 1 2
2 b 2 5
> d_m3<-merge(df1,df3,by.x="x",by.y ="g")
> d_m3
x y z
1 a 1 2
2 b 2 5
dplyr包提供了left_join()、 right_join()、 inner_join()、 full_join()四个函数。其中full_join()函数主要用来生成两个集合的并集;inner_join()生成有效数据;其他两个函数使用的较少。另外两个表格融合时会用NA代替不存在的值。
1只保留左表的数据
> d_join<-left_join(df1,df2,by="x")
> d_join
x y z
1 a 1 2
2 b 2 5
3 c 3 NA
2只保留右表的数据
> e_join<-right_join(df1,df2,by="x")
> e_join
x y z
1 a 1 2
2 b 2 5
3 d NA 3
3只保留两个表共有的数据
> f_join<-inner_join(df1,df2,by="x")
> f_join
x y z
1 a 1 2
2 b 2 5
4保留两个表所有信息
> g_join<-full_join(df1,df2,by="x")
> g_join
x y z
1 a 1 2
2 b 2 5
3 c 3 NA
4 d NA 3
5多列匹配合并 by=c("x","y")
> h_join<-left_join(x=df1,y=df4,by=c("x","y"))
> h_join
x y z
1 a 1 2
2 b 2 NA
3 c 3 NA
5 根据两个标的不同列明合并 by=c("x"="g")
> i_join
x y z
1 a 1 2
2 b 2 5
3 c 3 NA
6如果遇到了两个表中有一列同名,但值不相同,合并的时候又都想保留下来,就可以用suffix给每个标的重复列明增加后缀
> j_join<-left_join(x=df1,y=df4,by="x",suffix=c(".1",".2"))
> j_join
x y.1 y.2 z
1 a 1 1 2
2 b 2 4 5
3 c 3 NA NA
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。