R中的merge函數類似于Excel中的Vlookup,可以實現對兩個數據表進行匹配和拼接的功能。
1
|
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, ...) |
x,y:用于合并的兩個數據框
by,by.x,by.y:用于連接兩個數據集的列,intersect(a,b)值向量a,b的交集,names(x)指提取數據集x的列名 by = intersect(names(x), names(y)) 是獲取數據集x,y的列名后,提取其公共列名,作為兩個數據集的連接列, 當有多個公共列時,需用下標指出公共列,如names(x)[1],指定x數據集的第1列作為公共列 也可以直接寫為 by = ‘公共列名' ,前提是兩個數據集中都有該列名,并且大小寫完全一致,R語言區分大小寫
all,all.x,all.y:指定x和y的行是否應該全在輸出文件.
sort:by指定的列是否要排序.
suffixes:指定除by外相同列名的后綴.
incomparables:指定by中哪些單元不進行合并.
merge函數有4種匹配拼接模式,分別為inner,left,right和outer模式。 其中inner為默認的匹配模式。all=T代表全連接,all.x=T代表左聯結;all.y=T代表右連接
inner 模式匹配,只顯示兩個數據集公共列中均有的行
# 有多個公共列時,需指出使用哪一列作為連接列merge(x,y,by=intersect(names(x)[1],names(y)[1]))
# 當兩個數據集連接列名稱同時,直接用by.x,by.y 指定連接列merge(x,y,by.x ='name',by.y ='name')
# 當兩個數據集均有連接列時,直接指定連接列的名稱merge(x,y,by='name')
outer 模式,將兩張表的數據匯總,表中原來沒有的數據置為空
1
|
merge(x, y, all=TRUE, sort =TRUE) |
# all = TRUE 表示選取x, y 數據集的所有行,sort = TRUE,表示按 by 列進行排序,默認升序
left 匹配模式
1
|
merge(x ,y,all.x=TRUE, sort =TRUE) |
# 多個公共列 末指定連接列 ,左連接,設置 all.x = TRUE,結果只顯示數據x的列及x在y數據集中沒有的列
merge(x, y, by = 'name',all.x = TRUE, sort = TRUE) # 多個公共列 指定連接列指, 左連接,設置 all.x = TRUE,結果只顯示x所有names(x)[1]值
right 匹配模式
1
|
merge(x ,y ,by= 'name' ,all.y=TRUE, sort =TRUE) |
# 多個公共列指定連接列# 左連接,設置all.y =TRUE,結果只顯示y所有names(y) [1] 值的記錄
補充:R語言subset和merge函數的使用
1、merge函數對數據框的操作
從兩個數據框中選擇出條件相等的行組合成一個新的數據框
1
2
3
|
df1=data.frame(name=c( "aa" , "bb" , "cc" ),age=c(20,29,30),sex=c( "f" , "m" , "f" )) df2=data.frame(name=c( "dd" , "bb" , "cc" ),age=c(40,35,36),sex=c( "f" , "m" , "f" )) mergedf=merge(df1,df2,by= "name" ) |
2、subset函數
從某一個數據框中選擇出符合某條件的數據或是相關的列
(1)單條件查詢
1
2
3
4
5
6
7
8
9
|
> selectresult=subset(df1,name== "aa" ) > selectresult name age sex 1 aa 20 f > df1 name age sex 1 aa 20 f 2 bb 29 m 3 cc 30 f |
(2)指定顯示列
1
2
3
4
|
> selectresult=subset(df1,name== "aa" , select =c(age,sex)) > selectresult age sex 1 20 f |
(3)多條件查詢
1
2
3
4
5
6
7
8
9
|
> selectresult=subset(df1,name== "aa" & sex== "f" , select =c(age,sex)) > selectresult age sex 1 20 f > df1 name age sex 1 aa 20 f 2 bb 29 m 3 cc 30 f |
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。如有錯誤或未考慮完全的地方,望不吝賜教。
原文鏈接:https://www.jianshu.com/p/148a399b61d3