数据-R语言-图表-决策-Linux-PythonR语言与统计分析Cook R

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

2019-03-02  本文已影响107人  柳叶刀与小鼠标

目录

R语言第二章数据处理①选择列
R语言第二章数据处理②选择行
R语言第二章数据处理③删除重复数据
R语言第二章数据处理④数据框排序和重命名
R语言第二章数据处理⑤数据框列的转化和计算
R语言第二章数据处理⑥dplyr包(1)列选取
R语言第二章数据处理⑦dplyr包(2)列处理
R语言第二章数据处理⑧数据采样和离散化
R语言第二章数据处理(9)数据合并

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

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

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包的join函数

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

join(x, y, by = , copy = FALSE, )

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

inner_join函数

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

library(dplyr)
# 单指标匹配
inner_join(data1,data2)
inner_join(data1,data2,   c('city' = 'city'))

left_join函数

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

library(dplyr)
# 单指标匹配
left_join(data1,data2)
left_join(data1,data2,   c('city' = 'city'))

semi_join函数

结果, 行:显示x中所有能在y匹配到行,并对显示结果按匹配依据进行了排序; 列:显示x中的所有列。
semi_join连接其实是在inner_join的结果中只取属于a的字段(也就是列)

library(dplyr)
# 单指标匹配
semi_join(data1,data2)
semi_join(data1,data2,   c('city' = 'city'))

anti_join函数

结果, 行:显示x中所有未能在y中匹配到行, 并对显示结果按匹配依据进行了排序; 列:显示x中的所有列。
而anti_join其实就是a独有的记录

library(dplyr)
# 单指标匹配
anti_join(data1,data2)
anti_join(data1,data2,   c('city' = 'city'))

full_join函数

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

library(dplyr)
# 单指标匹配
full_join(data1,data2)
full_join(data1,data2,   c('city' = 'city'))
上一篇 下一篇

猜你喜欢

热点阅读