2017-07-19 95 views
0

道歉,如果這是重複請讓我知道,我會很樂意刪除。R合併列上的兩個數據幀保留列

我使用merge合併R中的兩個數據集。

age1 = c(5, 6, 7, 8, 10, 11) 
fname1 = c('david','alan','ben', 'ben', 'richard', 'edd') 
sname1 = c('albert','raymond','albert','pete','raymond', 'alan') 
area1 = c('r','t','n','x','z','w') 

df1 <- data.frame(age1, fname1, sname1, area1) 

age2 = c(5, 9, 10, 3, 4, 0) 
fname2 = c('david','alan','david', 'ben', 'richard', 'edd') 
sname2 = c('albert','edd','albert','pete','raymond', 'alan') 
area2 = c('w','z','x','n','t','r') 

df2 = data.frame(age2, fname2, sname2, area2) 

dataSet1的:

df1 
    age1 fname1 sname1 area1 
1 5 david albert  r 
2 6 alan raymond  t 
3 7  ben albert  n 
4 8  ben pete  x 
5 10 richard raymond  z 
6 11  edd alan  w 

數據集2

df2 
    age2 fname2 sname2 area2 
1 5 david albert  w 
2 9 alan  edd  z 
3 10 david albert  x 
4 3  ben pete  n 
5 4 richard raymond  t 
6 0  edd alan  r 

我上fname合併和sname用:

matchkey <- merge(df1, df2, by.x = c("fname1", "sname1"), by.y = c("fname2", "sname2")) 
View(matchkey) 

輸出:

> matchkey 
    fname1 sname1 age1 area1 age2 area2 
1  ben pete 8  x 3  n 
2 david albert 5  r 5  w 
3 david albert 5  r 10  x 
4  edd alan 11  w 0  r 
5 richard raymond 10  z 4  t 

但是,我想保持我已合併的列。我怎樣才能做到這一點?我應該使用合併以外的東西嗎?

預期輸出:

fname1 sname1 age1 area1 fname2 sname 2age2 area2 
1  ben pete 8  x ben pete  3  n 
2 david albert 5  r david albert 5  w 
3 david albert 5  r david albert 10  x 
4  edd alan 11  w edd alan  0  r 
5 richard raymond 10  z richard raymond 4  t 

我試圖尋找,但都沒有成功:

How do I combine two data-frames based on two columns?

Combining two dataframes keeping all columns

Merge two dataframes with repeated columns

非常感謝。

+1

這將是很容易釘在事後這些列。比如'matchkey [c(「fname2」,「sname2」)] < - matchkey [c(「fname1」,「sname1」)]'',儘管對我來說似乎多餘。 – lmo

+2

不是您想要按照定義添加的列與fname1和sname1完全相同嗎?一個快速的解決方案是做:'matchkey $ fname2 < - matchkey $ fname1'和'matchkey $ sname2 < - matchkey $ sname1' – user3640617

+0

歡呼聲給你們倆。我正在想辦法解決這個問題。感謝您的提示。 – Chuck

回答

1

由於合併的列在內部連接上完全相同或在數據幀之間完全匹配,因此只需將新列分配給剩下的列即可。你可以用transform()這樣做。下面增加了一個outer()結合paste0檢索所需的列順序:

matchkey <- transform(merge(df1, df2, by.x = c("fname1", "sname1"), 
             by.y = c("fname2", "sname2")), 
         fname2 = fname1, sname2 = sname1) 

ordercols <- c(outer(c("fname", "sname", "age", "area"), c(1:2), paste0)) 
matchkey <- matchkey[ordercols] 

matchkey  
# fname1 sname1 age1 area1 fname2 sname2 age2 area2 
# 1  ben pete 8  x  ben pete 3  n 
# 2 david albert 5  r david albert 5  w 
# 3 david albert 5  r david albert 10  x 
# 4  edd alan 11  w  edd alan 0  r 
# 5 richard raymond 10  z richard raymond 4  t 
+0

乾杯@Parfait。好辦法做到這一點,可以縮放到我的大型數據集。謝謝。 – Chuck

+0

太棒了!樂意效勞。 – Parfait