前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言第二章数据处理(9)数据合并

R语言第二章数据处理(9)数据合并

作者头像
用户1359560
发布2019-03-21 16:24:20
2.3K0
发布2019-03-21 16:24:20
举报
文章被收录于专栏:生信小驿站生信小驿站

=========================================

日常工作中常见的需求之一便是数据框合并,在R语言中最常用的是基于Rbasa的merge函数方法,除此之外还可以借助plyr和dplyr包中的join函数进行数据框的合并,它们数据框合并的原理同样是数据框的合并原理是这样的:首先在A数据框某一指定列的每一行内容在B数据框表的指定列进逐行匹配,直到A中所有行匹配完为止。

这里的数据仍使用merge函数中的两个数据(略有修改):作者信息数据和书籍信息数据。依照下面介绍的合并条件,这两个数据既有相同的内容,又有彼此中不存在的内容。

  • 构建数据集
代码语言:javascript
复制
> data1 <- data.frame(
+   id =  c(1, 2, 3, 4, 5),
+   city = I(c("GZ", "ZZ", 'BJ', "Newyork", "London")),
+   nationality = I(c( "CN", 'CN','CN','US',"BR")),
+   Count = c(100,30,20,40,50))
> 
> data1
  id    city nationality Count
1  1      GZ          CN   100
2  2      ZZ          CN    30
3  3      BJ          CN    20
4  4 Newyork          US    40
5  5  London          BR    50
> 
> 
> 
> 
> data2 <- data.frame(
+   id =  c(1, 2, 3, 4, 5),
+   city = I(c("GZ", "ZZ", 'SH', "Newyork", "Paris")),
+   nationality = I(c( "CN", 'CN','CN','US',"Fr")),
+   Area = c(3,5,7,3,2))
> 
> data2
  id    city nationality Area
1  1      GZ          CN    3
2  2      ZZ          CN    5
3  3      SH          CN    7
4  4 Newyork          US    3
5  5   Paris          Fr    2

plyr包的join函数

join函数:

代码语言:javascript
复制
join(x, y, by = NULL,  = 'left', match = 'all')
  • x,y 为合并的数据框
  • by 为排序依据,默认值Null时按名字相同的量匹配,此时,要求必须有相同列名的列
  • type为合并方式
    • inner,行:显示x,y中共有的行; 列:显示x,y中的所有列
    • left,行:显示x中所有的行; 列:显示x,y中的所有列,未匹配到的值,不论字符数字,全显示为NA
    • right,行:显示y中所有的行; 列:显示x,y中的所有列,未匹配到的值,不论字符数字,全显示为NA
    • full,先显示x中所有的行在y中的匹配结果,接着显示y中未匹配上的内容
  • match匹配的规则
    • first,只匹配y中的第一个记录
    • match,匹配y中所有记录

如何理解inne,left,right,可以看之前的博客:

Python数据处理从零开始----第二章(pandas)(十)pandas合并数据 - 简书

代码:

代码语言:javascript
复制
> plyr::join(data1,data2)
Joining by: id, city, nationality
  id    city nationality Count Area
1  1      GZ          CN   100    3
2  2      ZZ          CN    30    5
3  3      BJ          CN    20   NA
4  4 Newyork          US    40    3
5  5  London          BR    50   NA
> plyr::join(data1,data2, type = 'left', match = 'first')
Joining by: id, city, nationality
  id    city nationality Count Area
1  1      GZ          CN   100    3
2  2      ZZ          CN    30    5
3  3      BJ          CN    20   NA
4  4 Newyork          US    40    3
5  5  London          BR    50   NA
> plyr::join(data1,data2, type = 'inner')
Joining by: id, city, nationality
  id    city nationality Count Area
1  1      GZ          CN   100    3
2  2      ZZ          CN    30    5
3  4 Newyork          US    40    3
> plyr::join(data1,data2, type = 'right')
Joining by: id, city, nationality
  id    city nationality Count Area
1  1      GZ          CN   100    3
2  2      ZZ          CN    30    5
3  3      SH          CN    NA    7
4  4 Newyork          US    40    3
5  5   Paris          Fr    NA    2
> plyr::join(data1,data2, type = 'full',by='city')
  id    city nationality Count Area
1  1      GZ          CN   100    3
2  2      ZZ          CN    30    5
3  3      BJ          CN    20   NA
4  4 Newyork          US    40    3
5  5  London          BR    50   NA
6  3      SH          CN    NA    7
7  5   Paris          Fr    NA    2
> plyr::join(data1,data2, type = 'inner',by='city')
  id    city nationality Count id nationality Area
1  1      GZ          CN   100  1          CN    3
2  2      ZZ          CN    30  2          CN    5
3  4 Newyork          US    40  4          US    3

dplyr包的join函数

dplyr包是plyr包的升级,join函数在dplyr包中是个系列函数。 join函数:

代码语言:javascript
复制
join(x, y, by = , copy = FALSE, )
  • x,y 为合并的数据框,不要求x,y中排序列唯一
  • by 为排序依据,默认值Null时按名字相同的量匹配,此时,要求必须有相同列名的列
  • join为系列函数,包括inner_join、left_join、semi_join和anti_join函数

dplyr包的join函数似乎没有plyr包的join函数的match参数,只能进行所谓的all匹配

inner_join函数

函数结果, 行:显示x中所有能在y中匹配到行; 列:显示x,y中的所有列

代码语言:javascript
复制
library(dplyr)
# 单指标匹配
inner_join(data1,data2)
inner_join(data1,data2,   c('city' = 'city'))

left_join函数

结果, 行:显示x中所有的行; 列:显示x,y中的所有列,未匹配到的值,不论字符数字,全显示为NA。

代码语言:javascript
复制
library(dplyr)
# 单指标匹配
left_join(data1,data2)
left_join(data1,data2,   c('city' = 'city'))

semi_join函数

结果, 行:显示x中所有能在y匹配到行,并对显示结果按匹配依据进行了排序; 列:显示x中的所有列。

semi_join连接其实是在inner_join的结果中只取属于a的字段(也就是列)

代码语言:javascript
复制
library(dplyr)
# 单指标匹配
semi_join(data1,data2)
semi_join(data1,data2,   c('city' = 'city'))

anti_join函数

结果, 行:显示x中所有未能在y中匹配到行, 并对显示结果按匹配依据进行了排序; 列:显示x中的所有列。

而anti_join其实就是a独有的记录

代码语言:javascript
复制
library(dplyr)
# 单指标匹配
anti_join(data1,data2)
anti_join(data1,data2,   c('city' = 'city'))

full_join函数

结果, 行:显示x, y中所有的行, 未匹配到的值,不论字符数字,全显示为NA。

代码语言:javascript
复制
library(dplyr)
# 单指标匹配
full_join(data1,data2)
full_join(data1,data2,   c('city' = 'city'))
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.03.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • plyr包的join函数
  • dplyr包的join函数
    • inner_join函数
      • left_join函数
        • semi_join函数
          • anti_join函数
            • full_join函数
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档