2013-12-18 137 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