R语言使用merge函数匹配数据(vlookup,join)

R语言使用merge函数匹配数据(vlookup,join)R语言使用merge函数匹配数据(vlookup,join)

大家好,又见面了,我是你们的朋友全栈君。

参考文章 http://www.afenxi.com/post/41432

R中的merge函数类似于Excel中的Vlookup,可以实现对两个数据表进行匹配和拼接的功能。与Excel不同之处在于merge函数有4种匹配拼接模式,分别为inner,left,right和outer模式。 其中inner为默认的匹配模式,可与sql语言中的join语句用法。

merge 连接两个数据,官方参考文档语法

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, ...)

merge函数参数的说明:

  • x,y 要合并的两个数据集
  • by,用于连接两个数据集的列,intersect(a,b)值向量a,b的交集,names(x)指提取数据集x的列名
    by = intersect(names(x), names(y)) 是获取数据集x,y的列名后,提取其公共列名,作为两个数据集的连接列, 当有多个公共列时,需用下标指出公共列,如names(x)[1],指定x数据集的第1列作为公共列
    也可以直接写为 by = ‘公共列名’ ,前提是两个数据集中都有该列名,并且大小写完全一致,R语言区分大小写
  • by.x,by.y:指定依据哪些行合并数据框,默认值为相同列名的列
  • all,all.x,all.y:指定x和y的行是否应该全在输出文件
  • sort:by指定的列(即公共列)是否要排序
  • suffixes:指定除by外相同列名的后缀
  • incomparables:指定by中哪些单元不进行合并

举例说明如下

1、读取并创建数据示例

# 读取并创建贷款状态数据表
> loan_status=data.frame(read.csv('loan_status.csv',header = 1))

2、创建数据

> name <- c('A','B','A','A','C','D')
> school <- c('s1','s2','s1','s1','s1','s3')
> class <- c(10, 5, 4, 11, 1, 8)
> English <- c(85, 50, 90 ,90, 12, 96)
> w <- data.frame(name, school, class, English)
> w
  name school class English
    A    s1    10      85
    B    s2     5      50
    A    s1     4      90
    A    s1    11      90
    C    s1     1      12
    D    s3     8      96

#同上创建数据集q
> name  <-  c('A','B','C','F')
> school <- c('s3','s2','s1','s2')
> class <- c(5, 5, 1,3)
> maths <- c(80,89,55,90)
> English <- c(88, 89, 32, 89)
> q <- data.frame(name, school, class, maths, English)
> q
  name  school class maths English
    A     s3     5     80      88
    B     s2     5     89      89
    C     s1     1     55      32
    F     s2     3     90      89

3、查看两个数据表的维度

> dim(w);dim(q);
[1] 6 4
[1] 4 5

4、查看两个数据集的列名称

> names(w);names(q);
[1] "name"    "school"  "class"   "English"
[1] "name"    "school"  "class"   "maths"   "English"

# 可以看出两个数据集有公共列

5、inner 模式匹配,只显示两个数据集公共列中均有的行

# 有多个公共列时,需指出使用哪一列作为连接列
merge(w,q,by = intersect(names(w)[1],names(q)[1])) # 当两个数据集连接列名称同时,直接用 by.x, by.y 指定连接列 merge(w,q,by.x = 'name', by.y = 'name') # 当两个数据集均有连接列时,直接指定连接列的名称 merge(w,q,by = 'name') 

这里写图片描述

# 连接列置于第1列; 有多个公共列,在公共列后加上x,y表示数据来源,.x表示来源于数据集w,.y表示来源于数据集q
# 数据集中w中的 name = ‘D’ 不显示,数据集中q中的 name = ‘F’ 不显示,只显示公有的name行,并且用q数据集A行匹配了w数据集所有的A行

6、outer 模式,将两张表的数据汇总,表中原来没有的数据置为空

merge(w, q, all=TRUE, sort=TRUE) 

这里写图片描述

# all = TRUE 表示选取w, q 数据集的所有行,sort = TRUE,表示按 by 列进行排序,默认升序

7、left 匹配模式

merge(w ,q ,all.x=TRUE,sort=TRUE)  # 建议使用 指定了连接列 的情况
# 多个公共列,未指定连接列
# 左连接,设置 all.x = TRUE,结果只显示数据w的列及w在q数据集中没有的列

这里写图片描述

merge(w, q, by = 'name',all.x = TRUE, sort = TRUE)   # 指定连接列
# 多个公共列,指定连接列
# 左连接,设置 all.x = TRUE,结果只显示w所有name值

这里写图片描述

8、right 匹配模式

merge(w ,q ,by = 'name', all.y=TRUE,sort=TRUE) # 多个公共列,指定连接列 # 左连接,设置 all.y = TRUE,结果只显示q所有name值的记录

这里写图片描述

9、实例应用

library(readxl) 
library(xlsx)   

cdir = setwd('D:\\R')
A = read_excel('A.xlsx',  1)
B = read_excel('B.xlsx',  1)

dt = merge(A ,B ,all=TRUE, sort=TRUE, by = 'stuID')
dt2 = subset(dt, dt$math == 'A',select=names(dt))

# 在D:\\R 目录下创建sample.csv文件
cname = "D:\\R\\sample.csv"  

# 将匹配后的数据写入到 sample.csv 文件中
write.csv(dt2, cname ,sep=",")  
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133141.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • maven项目使用mybatis插件Free Mybatis plugin「建议收藏」

    maven项目使用mybatis插件Free Mybatis plugin「建议收藏」首先安装插件如图所示选择第一个插件安装,安装完毕重启IDEA 然后我们选择我们已经配置好的数据库如下图在需要生成配置文件的数据库上右键,就会出现mybatis-generator选项打开这个就打开如上图所示配置窗口,这里我们使用默认的就行,如果不想使用lombok去掉这个勾选即可,然后我们选择ok即可就会生成以上文件,一个数据库的映射类,一个操作数据库的映射接口,和具体操作数据库的xml,主配置文件就在Configure里面这个自己生成…

    2022年9月28日
    4
  • 39、文件的加密

    39、文件的加密

    2021年6月18日
    114
  • SSL协议概述和握手过程

    SSL协议概述和握手过程SSL协议主要是为了保证WEB通信的安全性,是基于TCP协议的SSL协议有三个特性:1.机密性SSL协议的机密性主要依靠的是对称加密体质,在通信过程中,使用对称密码进行加密解密保证信息的安全性。2.完整性SSL协议的完整性主要依靠的是散列技术,对分组数据进行压缩之后,利用散列函数获得哈希值,加在分组信息的尾部,并且利用对称密码进行加密之后再传输(在传输到TCP层之前还有一个动作

    2022年5月25日
    48
  • 二进制数的运算方法

    二进制数的运算方法1.二进制数的算术运算二进制数的算术运算包括:加、减、乘、除四则运算,下面分别予以介绍。(1)二进制数的加法根据“逢二进一”规则,二进制数加法的法则为:0+0=00+1=1+0=11+1=0 (进位为1)1+1+1=1(进位为1)例如:1110和1011相加过程如下:(2)二进制数的减法根据“借一有二”的规则,二进制数减法的法则为:

    2022年6月29日
    21
  • jdk环境变量的配置[通俗易懂]

    jdk环境变量的配置[通俗易懂]jdk下载并配置下载jdk下图是自己资源管理器中jdk的安装路径,双击然后next就好,不需要改什么配置手里没有安装包的,下载地址在这里:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html下面主要讲怎么配置Java的环境变量,也是为了以后哪天自己忘记了做个备份1.在电脑桌面右键点击“此电脑”的“属性”选项2.选择“高级系统设置”选项…

    2022年7月12日
    14
  • servlet的运行原理_高铁怎么运行的原理

    servlet的运行原理_高铁怎么运行的原理Servlet在容器中的执行过程1.浏览器向服务器发出GET请求2.服务器上的Tomcat接收到该url,根据该url判断为Servlet请求,此时Tomcat将产生两个对象:请求对象(HttpServletRequest)和响应对象(HttpServletResponce)3.Tomcat根据url找到目标Servlet,且创建一个线程4.Tomcat将刚才创建的请求对象和响应对象传递…

    2022年10月1日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号