表格的融合

2020-09-14 16:58:10 浏览数 (2)

有时候两个数据框并没有很好地保持一致,不能简单地使用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

0 人点赞