将两个data.frames合并为替换

时间:2013-12-18 14:52:49

标签: r join merge dataframe data.table

我有两个数据集。第一个较小,但有更精确的数据。 我需要加入他们,但是: 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包,但我无法让它发生,因为我喜欢。

3 个答案:

答案 0 :(得分:5)

不需要加入。您可以将问题重新表述为“将Data2中找到的数据添加到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 :(得分: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

答案 2 :(得分: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