2017-04-22 46 views
2

我有2個數據幀,如下所示。R合併 - 左連接,但顯示所有變量

DF_1 <- data.frame(ID_1 = c("A","1","2","3","B","1","2","3","C","1","2","3")) 
DF_2 <- data.frame(ID_2 = c("A","B","C")) 

我需要創建另一個像下面的數據框。

ID_1 ID_2 
1  A A 
2  1 <NA> 
3  2 <NA> 
4  3 <NA> 
5  B B 
6  1 <NA> 
7  2 <NA> 
8  3 <NA> 
9  C C 
10 1 <NA> 
11 2 <NA> 
12 3 <NA> 

我目前正在使用它來實現結果。但是,我想盡可能遠離sql。

library(sqldf) 
RESULT <- sqldf('select aa.ID_1, bb.ID_2 
       from DF_1 aa left join DF_2 bb 
       on aa.ID_1 = bb.ID_2') 

我也利用合併審理。

RESULT <- merge(DF_1, DF_2, by.x = "ID_1", by.y = "ID_2", all.x = TRUE) 

但是,我得到下面這是缺少ID_2

 ID_1 
1  1 
2  1 
3  1 
4  2 
5  2 
6  2 
7  3 
8  3 
9  3 
10 A 
11 B 
12 C 
+1

嘗試'DF_1 $ ID_2 <-ifelse(DF_1 $ ID_1%在%DF_2 $ ID_2,as.character(DF_1 $ ID_1),NA)''。你實際上並沒有進行合併。相反,在我看來,如果該值出現在第二個數據幀中,則需要另一列等於第一列,否則爲NA。 – nicola

回答

0

我們可以使用match

DF_1$ID_2 <- DF_2$ID_2[match(DF_1$ID_1, DF_2$ID_2)] 
DF_1 
# ID_1 ID_2 
#1  A A 
#2  1 <NA> 
#3  2 <NA> 
#4  3 <NA> 
#5  B B 
#6  1 <NA> 
#7  2 <NA> 
#8  3 <NA> 
#9  C C 
#10 1 <NA> 
#11 2 <NA> 
#12 3 <NA> 
2

這是因爲DF_2只有一列,所以列做合併上。您可以這樣做

merge(DF_1, cbind(DF_2, DF_2$ID_2), by.x = "ID_1", by.y = "ID_2", all.x = TRUE) 

    # ID_1 DF_2$ID_2 
# 1  1  <NA> 
# 2  1  <NA> 
# 3  1  <NA> 
# 4  2  <NA> 
# 5  2  <NA> 
# 6  2  <NA> 
# 7  3  <NA> 
# 8  3  <NA> 
# 9  3  <NA> 
# 10 A   A 
# 11 B   B 
# 12 C   C