2013-12-18 175 views
4

我有兩個數據集。第一個更小,但有更精確的數據。 我需要加入它們,但是: 1.如果我在Data1中有一些數據 - 我只使用這些數據。 2.如果Data1中沒有數據,但它們在Data2中 - 我只使用Data2中的數據。合併兩個數據幀與替換

Data1 <- data.frame(
    X = c(1,4,7,10,13,16), 
    Y = c("a", "b", "c", "d", "e", "f") 
) 

Data2 <- data.frame(
    X = c(1:10), 
    Y = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j") 
) 

所以我data.frame應該看起來像:

DataJoin <- data.frame(
    X = c(1,4,7,10,13,16,7,8,9,10), 
    Y = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j") 
) 

我怎麼能這樣做? 我試過不知何故選項合併形式的基礎包和data.table包,但我不能讓它發生,因爲我喜歡。

回答

5

沒有聯接需要。您可以將該問題重新表述爲「將Data2中的數據添加到Data1中,而Data1中的數據找不到Data1」。所以,簡單地做:

id <- Data2$Y %in% Data1$Y 
DataJoin <- rbind(Data1,Data2[!id,]) 

給出:

> DataJoin 
    X Y 
1 1 a 
2 4 b 
3 7 c 
4 10 d 
5 13 e 
6 16 f 
7 7 g 
8 8 h 
9 9 i 
10 10 j 
1
DataJoin <- merge(Data1, Data2, by="Y", all=TRUE) 

DataJoin$X.x[is.na(DataJoin$X.x)] <- DataJoin$X.y[is.na(DataJoin$X.x)] 
DataJoin[,1:2] 

# Y X.x 
# 1 a 1 
# 2 b 4 
# 3 c 7 
# 4 d 10 
# 5 e 13 
# 6 f 16 
# 7 g 7 
# 8 h 8 
# 9 i 9 
# 10 j 10 
3

使用data.table

d1 <- data.table(Data1, key="Y")[, X := as.integer(X)] 
d2 <- data.table(Data2, key="Y") 

# copy d2 so that it doesn't get modified by reference 
# i.X refers to the column X of DT in 'i' = d1's 'X' 
ans <- copy(d2)[d1, X := i.X] 
    X Y 
1: 1 a 
2: 4 b 
3: 7 c 
4: 10 d 
5: 13 e 
6: 16 f 
7: 7 g 
8: 8 h 
9: 9 i 
10: 10 j 
+0

嗨阿倫,也許我做錯了什麼,但是當我用你的代碼 - 結果我從D2僅數據.. –

+0

是的,你在你的文章中提到 - *我只使用Data2 *中的數據。所以,我認爲你只需要那些與兩者相匹配的替換,剩下的就剩下了。 – Arun

+1

我想你正在尋找類似於:'d1 [d2] [is.na(X),X:= X.1] [,X.1:= NULL] []' – Arun