合并两个数据框并替换重复值。

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")
)

所以我的数据框应该长成这样:
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")
)

我该怎么做呢?我尝试过使用base包和data.table包中的某些选项来合并表格,但是我并不能如愿以偿。

3个回答

5

不需要联接(join)操作。您可以将问题重新想象为“将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

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

嗨,Arun,也许我做错了什么,但是当我使用你的代码时,结果我只有来自d2的数据... - Jot eN
是的,你在帖子中提到了 - 我只使用Data2中的数据。所以,我认为你只想替换那些匹配的数据,而让其余的保持不变。 - Arun
1
我猜你正在寻找像这样的东西:d1[d2][is.na(X), X := X.1][, X.1 := NULL][] - Arun

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接