R语言学习笔记(3)——left_join() right_join() inner_join() full_join()

本文介绍了R语言中用于合并数据的四个关键函数:inner_join(), left_join(), right_join(), 和 full_join()。通过详细解释和实例演示,展示了它们的不同连接方式,包括等值连接、左连接、右连接和全连接。特别是,作者强调了在实际应用中,左连接通常用于保留原始数据。文章还提供了如何处理键名不同的情况,例如使用by参数进行连接。" 124212185,8575142,IDEA集成VisualGC插件进行JVM监控,"['Java', '开发工具', 'IDEA插件', '性能优化', '内存管理']

摘要

最近学习了《R数据科学》里的合并连接内容,这里直接用中文的表格来分析一下,可能更好理解。欢迎指正,谢谢。

函数介绍

四种函数都是用于组合两个表格的工具,对应四种连接方式,形式都是***_join(x,y,by=‘key’)

inner_join()

等值连接:两个观测的键是相等的,就可以匹配

left_join()

左连接:保留x中的所有观测

right_join()

右连接:保留y中的所有观测

full_join()

全连接:保留x和y中的所有观测

实例

是不是不知所云?没关系,直接看例子,这里采用内容为中文的数据框更容易理解。
假设有两个班级的考试名次表,class1class2,然后将通过四种方式组合这两个表,来达到不同要求比较的目的。为了方便观察,除了代码及输出结果外,每一个新的组合后的表都会通过view展现一下。

class1<-tribble(
  ~'名次',~'姓名',
  '第一名','王某人',
  '第二名','张周人',
  '第三名','李某人'
)
class2<-tribble(
  ~'名次',~'姓名',
  '第一名','胡某人',
  '第二名','刘周人',
  '第四名','于某人'
)

view一下
class1:
在这里插入图片描述
class2:
在这里插入图片描述

inner_join()

> inner_join(class1,class2,by='名次')
# A tibble: 2 x 3
  名次   姓名.x 姓名.y
  <chr>  <chr>  <chr> 
1 第一名 王某人 胡某人
2 第二名 张周人 刘周人

在这里插入图片描述
一班和二班均有第一名和第二名,所以等值连接把两张表里名次相同的人连接起来。

left_join()

> left_join(class1,class2,by='名次')
# A tibble: 3 x 3
  名次   姓名.x 姓名.y
  <chr>  <chr>  <chr> 
1 第一名 王某人 胡某人
2 第二名 张周人 刘周人
3 第三名 李某人 NA    

在这里插入图片描述
可以把参数 (class1,class2,by=‘名次’)这么理解,class1在左边就是左,class2在右边就是右。所以左连接说的保留x中的所有观测就是指:保留左边的即class1中的所有观测。那么class1的第一名、第二名、第三名都保留了下来,而class2的表里有的第一名和第二名的人的名字就连接过来了,没有第三名,则补充NA,第四名舍弃。
注意:一般情况下都会使用左连接,这样可以保留原表数据。

right_join()

> right_join(class1,class2,by='名次')
# A tibble: 3 x 3
  名次   姓名.x 姓名.y
  <chr>  <chr>  <chr> 
1 第一名 王某人 胡某人
2 第二名 张周人 刘周人
3 第四名 NA     于某人

在这里插入图片描述
看懂了左连接,这个右连接就容易了。右连接,则保留class2中的所有观测值,所以第一名、第二名、第四名都保留下来。一班class1则是第三名舍去,第四名的位置补充NA。

full_join()

> full_join(class1,class2,by='名次')
# A tibble: 4 x 3
  名次   姓名.x 姓名.y
  <chr>  <chr>  <chr> 
1 第一名 王某人 胡某人
2 第二名 张周人 刘周人
3 第三名 李某人 NA    
4 第四名 NA     于某人

在这里插入图片描述
全连接则是把左右两边的表格都保留下来,缺失的值补充NA,很好理解。

其他情况

上面几种情况都是两个表中有名称相同的键值。如果数据内容是一种类型,只是键的名称不同,可以采用这种方式:
left_join(x,y,by=c(‘a’=‘b’))
比如二班还有一张表,表示运动会各项目参与的人员

class2<-tribble(
  ~'名次',~'姓名',
  '第一名','胡某人',
  '第二名','刘某人',
  '第四名','于某人'
)
sports<-tribble(
  ~'项目',~'运动员',
  '乒乓球','于某人',
  '篮球','胡某人',
  '足球','刘某人'
)

sports:
在这里插入图片描述
class2:
在这里插入图片描述
这两个表的键名都不同,我们通过class2中的“姓名”和sports中的“运动员”对两个表进行连接

> left_join(class2,sports,by=c('姓名'='运动员'))
# A tibble: 3 x 3
  名次   姓名   项目  
  <chr>  <chr>  <chr> 
1 第一名 胡某人 篮球  
2 第二名 刘某人 足球  
3 第四名 于某人 乒乓球

在这里插入图片描述
两个表就连接起来了,可以看出二班排名第1、2、4的同学参与的运动会项目。

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值