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

2019-03-21 16:24:20 浏览数 (1)

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

日常工作中常见的需求之一便是数据框合并,在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'))

0 人点赞