=========================================
日常工作中常见的需求之一便是数据框合并,在R语言中最常用的是基于Rbasa的merge函数方法,除此之外还可以借助plyr和dplyr包中的join函数进行数据框的合并,它们数据框合并的原理同样是数据框的合并原理是这样的:首先在A数据框某一指定列的每一行内容在B数据框表的指定列进逐行匹配,直到A中所有行匹配完为止。
这里的数据仍使用merge函数中的两个数据(略有修改):作者信息数据和书籍信息数据。依照下面介绍的合并条件,这两个数据既有相同的内容,又有彼此中不存在的内容。
> 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
join函数:
join(x, y, by = NULL, = 'left', match = 'all')
如何理解inne,left,right,可以看之前的博客:
Python数据处理从零开始----第二章(pandas)(十)pandas合并数据 - 简书
代码:
> 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包是plyr包的升级,join函数在dplyr包中是个系列函数。 join函数:
join(x, y, by = , copy = FALSE, )
dplyr包的join函数似乎没有plyr包的join函数的match参数,只能进行所谓的all匹配
函数结果, 行:显示x中所有能在y中匹配到行; 列:显示x,y中的所有列
library(dplyr)
# 单指标匹配
inner_join(data1,data2)
inner_join(data1,data2, c('city' = 'city'))
结果, 行:显示x中所有的行; 列:显示x,y中的所有列,未匹配到的值,不论字符数字,全显示为NA。
library(dplyr)
# 单指标匹配
left_join(data1,data2)
left_join(data1,data2, c('city' = 'city'))
结果, 行:显示x中所有能在y匹配到行,并对显示结果按匹配依据进行了排序; 列:显示x中的所有列。
semi_join连接其实是在inner_join的结果中只取属于a的字段(也就是列)
library(dplyr)
# 单指标匹配
semi_join(data1,data2)
semi_join(data1,data2, c('city' = 'city'))
结果, 行:显示x中所有未能在y中匹配到行, 并对显示结果按匹配依据进行了排序; 列:显示x中的所有列。
而anti_join其实就是a独有的记录
library(dplyr)
# 单指标匹配
anti_join(data1,data2)
anti_join(data1,data2, c('city' = 'city'))
结果, 行:显示x, y中所有的行, 未匹配到的值,不论字符数字,全显示为NA。
library(dplyr)
# 单指标匹配
full_join(data1,data2)
full_join(data1,data2, c('city' = 'city'))