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