有时候两个数据框并没有很好地保持一致,不能简单地使用cbind()和rbind()函数,所以他们需要一个共同的列(common key)作为细胞融合的依据。最常用的内置函数为merge()和dplyr()包中的*_join(系列函数。
1 merge()函数
优势在于对于不同的数据框,可以指定不同的匹配列名;缺点再于运行速度较慢,其中by.x指定左边数据框匹配列,by.y指定右边数据框匹配列。
代码语言:javascript复制> 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)
all参数决定有缺失值的行处理原则
代码语言:javascript复制d_m1<-merge(df1,df2,by="x",all=TRUE)
代码语言:javascript复制> d_m1
x y z
1 a 1 2
2 b 2 5
3 c 3 NA
4 d NA 3
代码语言:javascript复制> d_m1<-merge(df1,df2,by="x",all=FALSE) #有缺损的被去掉了
> d_m1
x y z
1 a 1 2
2 b 2 5
对于列明不一样的表合并,可以用by.x和by.y
代码语言:javascript复制> d_m3<-merge(df1,df3,by.x="x",by.y ="g")
> d_m3
x y z
1 a 1 2
2 b 2 5
2 *_join()系列函数
dplyr包提供了left_join()、 right_join()、 inner_join()、 full_join()四个函数。其中full_join()函数主要用来生成两个集合的并集;inner_join()生成有效数据;其他两个函数使用的较少。另外两个表格融合时会用NA代替不存在的值。
1只保留左表的数据
代码语言:javascript复制> 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只保留右表的数据
代码语言:javascript复制> 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只保留两个表共有的数据
代码语言:javascript复制> f_join<-inner_join(df1,df2,by="x")
> f_join
x y z
1 a 1 2
2 b 2 5
4保留两个表所有信息
代码语言:javascript复制> 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")
代码语言:javascript复制> 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")
代码语言:javascript复制> i_join
x y z
1 a 1 2
2 b 2 5
3 c 3 NA
6如果遇到了两个表中有一列同名,但值不相同,合并的时候又都想保留下来,就可以用suffix给每个标的重复列明增加后缀
代码语言:javascript复制> 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