可变联接将列从 y 添加到 x,并根据键值匹配行:
inner_join():包括 x 和 y 中的所有行。
left_join():包括 x 中的所有行。
right_join():包括 y 中的所有行。
full_join():包括 x 或 y 中的所有行。
如果 x 中的一行与 y 中的多行匹配,则 y 中的所有行将针对 x 中的每个匹配行返回一次。
实例
假设有两个班级的考试名次表,class1和class2,然后将通过四种方式组合这两个表,来达到不同要求比较的目的。
1 2 3 4 5 6 7 8 9 10 11 12 | class1 <- tribble ( ~ '名次' ,~ '姓名' , '第一名' , '王某人' , '第二名' , '张周人' , '第三名' , '李某人' ) class2 <- tribble ( ~ '名次' ,~ '姓名' , '第一名' , '胡某人' , '第二名' , '刘周人' , '第四名' , '于某人' ) |
class1:
class2:
inner_join()
1 2 3 4 5 6 | > inner_join (class1,class2,by= '名次' ) # A tibble: 2 x 3 名次 姓名.x 姓名.y <chr> <chr> <chr> 1 第一名 王某人 胡某人 2 第二名 张周人 刘周人 |
一班和二班均有第一名和第二名,所以等值连接把两张表里名次相同的人连接起来。
left_join()
1 2 3 4 5 6 7 | > 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()
1 2 3 4 5 6 7 | > right_join (class1,class2,by= '名次' ) # A tibble: 3 x 3 名次 姓名.x 姓名.y <chr> <chr> <chr> 1 第一名 王某人 胡某人 2 第二名 张周人 刘周人 3 第四名 NA 于某人 |
看懂了左连接,这个右连接就容易了。右连接,则保留class2中的所有观测值,所以第一名、第二名、第四名都保留下来。一班class1则是第三名舍去,第四名的位置补充NA。
full_join()
1 2 3 4 5 6 7 8 | > 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’))
比如二班还有一张表,表示运动会各项目参与的人员
1 2 3 4 5 6 7 8 9 10 11 12 | class2<- tribble ( ~ '名次' ,~ '姓名' , '第一名' , '胡某人' , '第二名' , '刘某人' , '第四名' , '于某人' ) sports<- tribble ( ~ '项目' ,~ '运动员' , '乒乓球' , '于某人' , '篮球' , '胡某人' , '足球' , '刘某人' ) |
sports:
class2:
这两个表的键名都不同,我们通过class2中的“姓名”和sports中的“运动员”对两个表进行连接
1 2 3 4 5 6 7 | > left_join (class2,sports,by= c ( '姓名' = '运动员' )) # A tibble: 3 x 3 名次 姓名 项目 <chr> <chr> <chr> 1 第一名 胡某人 篮球 2 第二名 刘某人 足球 3 第四名 于某人 乒乓球 |
两个表就连接起来了,可以看出二班排名第1、2、4的同学参与的运动会项目。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!