R语言数据合并与连接技巧

  • Post author:
  • Post category:其他


最近仍然在陆陆续续自学,真.生命不息学习不止,这次和大家分享一些实用的数据处理技巧,干货满满!

一、数据合并

涉及函数cbind(),rbind(),bind_rows(),bind_cols().

cbind(),rbind()在我前面写的《R语言编程艺术学习笔记》中已经出现过了,很好用,举个栗子:

> data1<-data.frame(
+   nameA=c("Tom","Jack","Max","Jim"),
+   value=c(24,62,47,16)
+ )
> data1
  nameA value
1   Tom    24
2  Jack    62
3   Max    47
4   Jim    16
> data2<-data.frame(
+   nameB=c("Andy","Sun","Gray","Hennry"),
+   value=c(38,21,55,29)
+ )
> data2
   nameB value
1   Andy    38
2    Sun    21
3   Gray    55
4 Hennry    29
> cbind(data1,data2)
  nameA value  nameB value
1   Tom    24   Andy    38
2  Jack    62    Sun    21
3   Max    47   Gray    55
4   Jim    16 Hennry    29
> rbind(data1,data2)
Error in match.names(clabs, names(xi)) : 名字同原来已有的名字不相对

这里定义了两个数据框data1和data2,这里定义nameA、nameB和value三个字段,当使用cbind(),实现按列合并,但使用rbind()是报错了,因为nameA、nameB不同,而rbind()函数要求合并的字段名称必须相同。

为了解决这个问题,使用dplyr包中的bind_rows()函数,不要求合并字段的名称必须相同,这个函数会自己做判断,看例子

> library(dplyr)
> dplyr::bind_rows(data1,data2)
  nameA value  nameB
1   Tom    24   <NA>
2  Jack    62   <NA>
3   Max    47   <NA>
4   Jim    16   <NA>
5  <NA>    38   Andy
6  <NA>    21    Sun
7  <NA>    55   Gray
8  <NA>    29 Hennry

dplyr::bind_rows中的::表示引用dplyr包中的函数,这里可以看到nameA、nameB各自有一列,value的值合并了,对于nameA中的值在nameB中没有对应的值,则用NA空值表示。

二、数据连接

涉及函数merge()、dplyr包中的inner_join()、left_join()、right_join()、full_join(),通过例子方便大家理解

> table1<-data.frame(
+   Id=c(1,2,3),
+   sex=c("女","男","男")
+ )
> table2<-data.frame(
+   Id=c(1,2,4),
+   age=c(22,17,33)
+ )
> table1
  Id sex
1  1  女
2  2  男
3  3  男
> table2
  Id age
1  1  22
2  2  17
3  4  33
> merge(table1,table2,by="Id",all=FALSE)#内连接
  Id sex age
1  1  女  22
2  2  男  17
> merge(table1,table2,by="Id",all=TRUE)#外连接
  Id  sex age
1  1   女  22
2  2   男  17
3  3   男  NA
4  4 <NA>  33
> merge(table1,table2,by="Id",all.x=TRUE)#左连接
  Id sex age
1  1  女  22
2  2  男  17
3  3  男  NA
> merge(table1,table2,by="Id",all.y=TRUE)#右连接
  Id  sex age
1  1   女  22
2  2   男  17
3  4 <NA>  33

merge()函数中by用于指定连接的字段,即通过哪个字段进行连接,通过all=TRUE或者FALSE来决定是连接保留相同ID的字段,还是连接展示ID所有字段,all.x指通过第一个数据框进行连接,即保留第一个数据框的所以ID对应值,去掉不包含的;同理all.y指通过第二个数据框进行连接,即保留第二个数据框的所以ID对应值,去掉不包含的。

#用dplyr包进行连接
inner_join(table1,table2,by="id")
left_join(table1,table2,by="id")
right_join(table1,table2,by="id")
full_join(table1,table2,by="id")

dplyr包中则通过控制函数来连接,这个就更加直观好理解些。

> inner_join(table1,table2,by="Id")
  Id sex age
1  1  女  22
2  2  男  17
> left_join(table1,table2,by="Id")
  Id sex age
1  1  女  22
2  2  男  17
3  3  男  NA
> right_join(table1,table2,by="Id")
  Id  sex age
1  1   女  22
2  2   男  17
3  4 <NA>  33
> full_join(table1,table2,by="Id")
  Id  sex age
1  1   女  22
2  2   男  17
3  3   男  NA
4  4 <NA>  33

以上就是今天的小技巧分享内容,希望对你有所帮助,有疑问欢迎提问,下次再见!



版权声明:本文为Anna_datahummingbird原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。