R7—左右内全连接详解
在SQL查询中,经常会用到左连接、右连接、内连接、全连接,那么在R中如何实现这些功能,今天来讲一讲!
SQL回顾
原理
# 连接可分为以下几类:
内连接。(典型的连接运算,使用像 = 或 <> 之类的比较运算符)。包括相等连接和自然连接。
内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students 和 courses 表中学生标识号相同的所有行。
外连接。外连接可以是左向外连接、右向外连接或完整外部连接。
在FROM子句中指定外连接时,可以由下列几组关键字中的一组指定:
LEFT JOIN 或 LEFT OUTER JOIN。
左向外连接的结果集包括LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
RIGHT JOIN 或 RIGHT OUTER JOIN。
右向外连接是左向外连接的反向连接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
FULL JOIN 或 FULL OUTER JOIN。
完整外部连接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
交叉连接。交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉连接也称作笛卡尔积。
示例分析。
注:a.id和parent_id之间有关系!
a表 | b表 |
id name |
id job parent_id |
内连接
select a.*,b.* from a inner join b on a.id=b.parent_id
id name id job parent_id 1 张3 1 23 1 |
左连接
select a.*,b.* from a left join b on a.id=b.parent_id
id name id job parent_id 1 张3 1 23 1 |
右连接
select a.*,b.* from a right join b on a.id=b.parent_id
id name id job parent_id 1 张3 1 23 1 |
完全连接
select a.*,b.* from a full join b on a.id=b.parent_id
id name id job parent_id 1 张3 1 23 1 |
总结
LEFT JOIN 会从左表(a表)那里返回所有的记录,即使在右表(b表)中没有匹配的行。
RIGHT OUTER JOIN 右连接,返回右表中的所有记录,即使在左表中没有记录与它匹配。
FULL OUTER JOIN 全连接, 返回左右表中的所有记录。
R实现
R里面实现连接的函数最基本的是base包中的merge函数(专门针对数据框,对应于SQL中的表),操作非常简单,下面做一下简要分析!
merge函数语法
# Merge Two Data Frames:Merge two data frames by common columns or row names, or do other versions of database join operations。
# Usage
merge(x, y, ...) ## Default S3 method:
merge(x, y, by = intersect(names(x), names(y)),by.x = by, by.y = by, all= FALSE, all.x = all,all.y = all,sort = TRUE, suffixes = c(".x",".y"),incomparables= NULL,...) ## S3 method for class 'data.frame'(蓝色高亮为常用参数
# Arguments(参数说明)
x,y:数据框 | by,by.x,by.y:指定用于合并连接(merge)的列 | all,all.x,all.y:指定连接的方式 | sort:逻辑值,输出结果按 by指定的列排序吗? | suffixes: | incomparables:
# details(细节说明)
默认下,merge函数会以内连接(即自然连接:data frames are merged on the columns with names they both have)的方式合并数据框。by.x和by.y指定用于连接的列。all系列指定连接的方式:all=FALSE指定自然连接(默认), all.x=TRUE指定左连接, all.y=TRUE指定右连接, all=TRUE指定全连接!
# 示例
注:surname和name有关系!
authors | books |
surname nationality deceased 1 Tukey US yes 2 Venables Australia no 3 Tierney US no 4 Ripley UK no 5 McNeil Australia no
|
name title other.author 1 Tukey Exploratory Data Analysis <NA> 2 Venables Modern Applied Statistics ... Ripley 3 Tierney LISP-STAT <NA> 4 Ripley Spatial Statistics <NA> 5 Ripley Stochastic Simulation <NA> 6 McNeil Interactive Data Analysis <NA> 7 R Core An Introduction to R Venables & Smith |
# 内连接:指定参数all=FALSE,并按by.x排序(sort=TRUE指定)
> merge(x = authors,y = books,by.x = 'surname',by.y='name',all=FALSE,sort = TRUE ) surname nationality deceased title other.author 1 McNeil Australia no Interactive Data Analysis <NA> 2 Ripley UK no Spatial Statistics <NA> 3 Ripley UK no Stochastic Simulation <NA> 4 Tierney US no LISP-STAT <NA> 5 Tukey US yes Exploratory Data Analysis <NA> 6 Venables Australia no Modern Applied Statistics ... Ripley
|
#左连接:以books为左表,author为右表进行左连接
> merge(x = books,y = authors, by.x = 'name',by.y='surname',all.x=TRUE,sort = TRUE ) name title other.author nationality deceased 1 McNeil Interactive Data Analysis <NA> Australia no 2 R Core An Introduction to R Venables & Smith <NA> <NA> 3 Ripley Spatial Statistics <NA> UK no 4 Ripley Stochastic Simulation <NA> UK no 5 Tierney LISP-STAT <NA> US no 6 Tukey Exploratory Data Analysis <NA> US yes 7 Venables Modern Applied Statistics ... Ripley Australia no
|
#右连接:右连接和左连接类似,直接略过!
#全连接:两个表中的公共连接字段都返回,未匹配到的返回为NA!
> merge(x = books,y = authors, by.x = 'name',by.y='surname',all=TRUE,sort = TRUE ) name title other.author nationality deceased 1 McNeil Interactive Data Analysis <NA> Australia no 2 R Core An Introduction to R Venables & Smith <NA> <NA> 3 Ripley Spatial Statistics <NA> UK no 4 Ripley Stochastic Simulation <NA> UK no 5 Tierney LISP-STAT <NA> US no 6 Tukey Exploratory Data Analysis <NA> US yes 7 Venables Modern Applied Statistics ... Ripley Australia no |
#扩展:incomparable参数的使用
merge函数不仅可以进行通常的SQL连接, 还可以执行行连接,返回两个表中某两列对应行相等时的行观测值,这个可以通过by=参数来指定(其实,取的是交集)!
x表 | y表 |
k1 k2 data 4 4 4 5 5 5 |
k1 k2 data 5 5 5 |
# 匹配x和y表中k1、k2字段下值对应相等时的观测值(它的原理应该是:先取k1、k2向量的交集,返回交集对应的行号,然后再根据行号从两个表中取观测值!)
> merge(x, y, by = c("k1","k2")) #NA’s match |
# 只匹配k1,即两个表中,返回k1对应的公共字段对应对应行号的观测值!
> merge(x, y, by = "k1") |
# 使用incomparable参数,可以看到:incomparable=NA去掉了所有包含NA的观测值!
> merge(x, y, by = "k2", incomparables = NA) |
补充:
数学中集合论中的交并补集在R中怎么实现呢?这里简要补充一下!
union:并集,intercept:交集,setdiff:补集,setequal:比较两个集合是否相等
例子
> (x <- c(sort(sample(1:20, 9)), NA)) : [1] 4 5 6 10 12 15 17 19 20 NA > (y <- c(sort(sample(3:23, 7)), NA)) : [1] 3 4 7 9 12 20 22 NA > union(x, y) : [1] 4 5 6 10 12 15 17 19 20 NA 3 7 9 22 > intersect(x, y) : [1] 4 12 20 NA > setdiff(x, y) : [1] 5 6 10 15 17 19 > setdiff(y, x) : [1] 3 7 9 22 > setequal(x, y) : [1] FALSE |
R7—左右内全连接详解的更多相关文章
- sql各种连接详解
迁移时间:2017年6月1日16:33:58 CreateTime--2016年9月14日11:19:00Author:Marydon sql各种连接详解 参考链接: http://www.jb5 ...
- 序列内置方法详解(string/list/tuple)
一.常用方法集合 1.1.string,字符串常用方法 以下举例是python2.7测试: 函数名称 作用 举例 str.capitalize() 字符串第一个字符如果是字母,则把字母替换为大写字母. ...
- Kubernetes YAML 文件全字段详解
Kubernetes YAML 文件全字段详解 Deployment yaml 其中主要参数都在podTemplate 中,DaemonSet StatefulSet 中的pod部分一样. apiVe ...
- Sqlmap全参数详解
sqlmap全参数详解 sqlmap是在sql注入中非常常用的一款工具,由于其开源性,适合从个人到企业,从学习到实战,各领域各阶段的应用,我们还可以将它改造成我们自己独有的渗透利器.这款工具中,大大小 ...
- MYSQL常用内置函数详解说明
函数中可以将字段名当作变量来用,变量的值就是该列对应的所有值:在整理98在线字典数据时(http://zidian.98zw.com/),有这要一个需求,想从多音字duoyinzi字段值提取第一个拼音 ...
- HTML video 视频标签全属性详解
HTML 5 video 视频标签全属性详解 现在如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theora或者VP8(如果这玩意儿没出事的话)的(Opera.Mozilla.C ...
- HTML-▲▲video 视频标签全属性详解▲▲
HTML 5 video 视频标签全属性详解 现在如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theora或者VP8(如果这玩意儿没出事的话)的(Opera.Mozilla.C ...
- Python内置方法详解
1. 字符串内置方法详解 为何要有字符串?相对于元组.列表等,对于唯一类型的定义,字符串具有最简单的形式. 字符串往往以变量接收,变量名. 可以查看所有的字符串的内置方法,如: 1> count ...
- Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件
封面:洛小汐 作者:潘潘 若不是生活所迫,谁愿意背负一身才华. 前言 上节我们介绍了 < Mybatis系列全解(四):全网最全!Mybatis配置文件 XML 全貌详解 >,内容很详细( ...
随机推荐
- loadrunner在win10破解提示:Cannot save the license information because acceses to the registry is denied的解决办法
方法1 下图1-1中提示就是说明了破解的时候权限不足导致,解决办法就是使用管理员权限打开loadrunner破解就好了,但是右键“以管理员身份运行”选项打开loadrunner又是会提示1-2中的问题 ...
- js ajax 经典案例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 1使用 vue-cli 搭建项目(cp)
http://www.cnblogs.com/wisewrong/p/6255817.html(copy:web) https://zhuanlan.zhihu.com/p/26183652(也很好) ...
- 如何在Windows下查看JAVA端口占用情况(阿里面试)
如需要确定谁占用了9050端口 为例: 1.Windows平台 在windows命令行窗口下执行: 1.查看所有的端口占用情况 C:\>netstat -ano 协议 本地地址 外部地址 状态 ...
- 清华集训2015-Day 2
校内测试做到了,于是就把解题报告发出来. 简单回路 一个 \(n\times m\) 的方格纸,有 \(k\) 个障碍点.\(q\) 次询问,每次询问 \((x,y)\) ,问有多少条简单回路经过 \ ...
- Python 变量 (上)
Python通过变量引用内存中的值,变量的值占用多少空间是由变量的类型决定的.声明变量不需要指定变量的类型,解释器会自动根据值来判断.变量名称必须符合标识符的定义 标识符 标识符是由字母,数字和下划线 ...
- MT【137】多少个?
数列\(\{a_n\}\)共11项,\(a_1=0,a_{11}=4\),且\(|a_{k+1}-a_{k}|=2,k=1,2,\cdots,10\) 求满足条件的不同的数列的个数______ 解答: ...
- 【刷题】BZOJ 2049 [Sdoi2008]Cave 洞穴勘测
Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好 ...
- 【LOJ2541】【PKUWC2018】猎人杀(容斥,FFT)
[LOJ2541][PKUWC2018]猎人杀(容斥,FFT) 题面 LOJ 题解 这题好神仙啊. 直接考虑概率很麻烦,因为分母总是在变化. 但是,如果一个人死亡之后,我们不让他离场,假装给他打一个标 ...
- 【BZOJ2989】数列(CDQ分治,扫描线)
[BZOJ2989]数列(CDQ分治) 题面 BZOJ 权.....权限题.. 题解 Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和 ...