2017-05-29 73 views
1

我有兩個數據幀,包含重複列data1data2。我現在正在運行for循環,每個循環將data1中的一列與data2中的整列合併。例如r:在沒有公共列的情況下合併數據的有效方法

數據1:

1 1 3 4 4 
2 5 2 4 2 
2 2 8 8 0 

數據2

1 4 5 4 5 
2 9 3 4 5 
2 7 4 8 0 

columns 1 and 4data1data2重複。對於第一個循環,它合併

1 
2 
2 

data2

1 4 5 4 5 
2 9 3 4 5 
2 7 4 8 0 

所以期望的結果是

1 4 5 4 5 
2 9 3 4 5 
2 7 4 8 0 

然後,它前進到second column

1 
5 
2 

一個第二它data2

1 4 5 4 5 
    2 9 3 4 5 
    2 7 4 8 0 

合併期望的結果將是

1 1 4 5 4 5 
    5 2 9 3 4 5 
    2 2 7 4 8 0 

我的想法是使用combinemerge功能,但是這兩個功能都沒有達到預期的輸出

for(i in 1:dim(data[2])){ 
    datam_merge<- merge(data1[i], data2) 
} 

任何建議表示讚賞!

+0

是重複列總是在兩個數據集相同的位置(如在你的例子)?然後你可以簡單地比較它們,然後只是'cbind'。像'indx < - colSums(data2 == data1)!= nrow(data2); cbind(data2,data1 [,indx])'。另外,你使用'merges'這個術語的方式對我來說沒有意義,而不是合併重複的列,你可以忽略其中的一個並繼續前進,爲什麼要合併它們? –

回答

-1

這應該做的伎倆:

data3 <- dplyr::left_join(data2, data1) 
head(data3) 

left_join()功能是確定data2具有在共同與DATA1的列,然後只接合異種列從data1data2

我注意到你的「想要的結果」是從data1下降第5列。這是故意的,還是您希望的輸出是一個新的數據框,它包含來自data1data2的所有列而沒有任何重複?

這是另一種方法,可能是一個更廣義的解決方案:

data3 <- dplyr::inner_join(data1, data2) 

這隻加入或者兩個dataframes而不是僅僅data1之間的唯一列。

讓我知道這是你在找什麼!

編輯: 這是我的例子:

data1 <- data.frame(c(1,2,2),c(1,5,2),c(3,2,8),c(4,4,8),c(4,2,0)) 
names(data1) <- c("A","B","C","D","E") 
data2 <- data.frame(c(1,2,2),c(4,9,7),c(5,3,4),c(4,4,8),c(5,5,0)) 
names(data2) <- c("A","F","G","D","H") 

## columns 'A' and 'D' are in common, but we only need one of each letter ('A' through 'E'). 
data3 <- left_join(data2, data1) 
head(data3) 
    A F G D H B C E 
1 1 4 5 4 5 1 3 4 
2 2 9 3 4 5 5 2 2 
3 2 7 4 8 0 2 8 0 
+0

不,'dplyr :: left_join'只會通過公共列名稱(如果沒有另外指定)加入,這意味着它將通過* all *列加入,並且您將只返回'data2'(這不是所需的輸出)。而'dplyr :: left_join'將返回併爲空數據框。你甚至檢查你的結果並將其與期望的輸出進行比較嗎? –

+0

是的,我檢查了我的結果。在這種情況下,來自'left_join()'和'inner_join()'的輸出提供了一個新的數據幀和8個唯一列(移除2個重複向量)。看到我的編輯與一個可重複的例子。 – spacedSparking

+0

這是因爲您的列名是由它們包含的值自動設置的。我懷疑在現實生活中這是否屬實,例如沒有人有'c.1..2..2.'作爲列名。順便說一句,沒有必要爲了做一個簡單的「合併」而導致dplyr。 –

相關問題