R语言使用merge函数匹配数据(vlookup,join)
2017-06-10 11:40
323 查看
参考文章 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(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中哪些单元不进行合并
2、创建数据
3、查看两个数据表的维度
4、查看两个数据集的列名称
5、inner 模式匹配,只显示两个数据集公共列中均有的行
# 连接列置于第1列; 有多个公共列,在公共列后加上x,y表示数据来源,.x表示来源于数据集w,.y表示来源于数据集q
# 数据集中w中的 name = ‘D’ 不显示,数据集中q中的 name = ‘F’ 不显示,只显示公有的name行,并且用q数据集A行匹配了w数据集所有的A行
6、outer 模式,将两张表的数据汇总,表中原来没有的数据置为空
# all = TRUE 表示选取w, q 数据集的所有行,sort = TRUE,表示按 by 列进行排序,默认升序
7、left 匹配模式
8、right 匹配模式
9、实例应用
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=",")
相关文章推荐
- CakePHP - 使用matching & join匹配关联数据
- excel VLOOKUP 函数使用跨Sheet抓取匹配数据列
- 火车头使用正则匹配模式采集数据
- JavaScript中使用正则匹配多条,且获取每条中的分组数据
- 我使用过的Linux命令之join - 根据关键字合并数据文件
- (编程训练)再回首,数据结构——(升级版)使用栈判断括号匹配
- (编程训练)再回首,数据结构——使用栈判断括号匹配
- 在C#中使用正则表达式自动匹配并获取所需要的数据
- R语言学习之一些基本数据的建立以使用
- 考研数据结构与算法之堆栈的使用(三)利用堆栈匹配括号
- 【Excel】如何将第二列的数据与第一列的匹配并将其数据放到与第一列对应的行(VLOOKUP)
- 使用文件保存数据以及在此基础上实现判断登陆账号密码匹配问题的实现
- 二表关联查询 而当某数据不能互相匹配使用默认值代替
- 使用join对数据表进行连接查询
- 在C#中使用正则表达式自动匹配并获取所需要的数据 (转)
- 更新表中数据可以使用join
- JavaScript中使用正则匹配多条,且获取每条中的分组数据
- SSIS: 使用Lookup 和 Cache transformation 进行数据匹配简单介绍
- 使用FULL OUTER JOIN拼接多表数据
- 在C#中使用正则表达式自动匹配并获取所需要的数据