我有两个数据集,想要合并它们。我如何仅向第一个数据集添加第二个中不在第一个数据集中的行?
如果该值不存在于另一个数据集中,则仅添加到最终数据集。示例数据集:
x = data.frame(id = c("a","c","d","g"),
value = c(1,3,4,7))
y = data.frame(id = c("b","c","d","e","f"),
value = c(5,6,8,9,7))
合并的数据集应该看起来像(顺序并不重要):
a 1
b 5
c 3
d 4
e 9
f 7
g 7
答案 0 :(得分:2)
使用!
,%in%
和rbind
:
rbind(x[!x$id %in% y$id,], y)
id value
1 a 1
4 g 7
3 b 2
41 c 3
5 d 4
6 e 5
7 f 6
答案 1 :(得分:2)
要使您的示例正常工作,首先需要确保每个data.frame中的id
可以直接进行比较。由于它们是因素,因此您需要确保它们具有相同的水平/标签;或者你可以将它们转换为角色。
# convert factors to character
x$id <- as.character(x$id)
y$id <- as.character(y$id)
# merge
z <- merge(x,y,by="id",all=TRUE)
# keep first value, if it exists
z$value <- ifelse(is.na(z$value.x),z$value.y,z$value.x)
# keep desired columns
z <- z[,c("id","value")]
z
# id value
# 1 a 1
# 2 b 5
# 3 c 3
# 4 d 4
# 5 e 9
# 6 f 7
# 7 g 7
答案 2 :(得分:1)
你已经回答了自己的问题,但却没有马上意识到这一点。 :)
> merge(x,y,all=TRUE)
id value
1 a 1
2 c 3
3 c 6
4 d 4
5 d 8
6 g 7
7 b 5
8 e 9
9 f 7
修改的
我在这里有点密集,我不确定你在哪里,所以我为你提供了一个猎枪方法。我做的是我将数据框架合并到id
,如果缺少y,则将x
的值复制到y
。拿你需要的任何一列。
> x = data.frame(id = c("a","c","d","g"),
+ value = c(1,3,4,7))
> y = data.frame(id = c("b","c","d","e","f"),
+ value = c(5,6,8,9,7))
> xy <- merge(x, y, by = "id", all = TRUE)
> xy
id value.x value.y
1 a 1 NA
2 c 3 6
3 d 4 8
4 g 7 NA
5 b NA 5
6 e NA 9
7 f NA 7
> find.na <- is.na(xy[, "value.y"])
> xy$new.col <- xy[, "value.y"]
> xy[find.na, "new.col"] <- xy[find.na, "value.x"]
> xy
id value.x value.y new.col
1 a 1 NA 1
2 c 3 6 6
3 d 4 8 8
4 g 7 NA 7
5 b NA 5 5
6 e NA 9 9
7 f NA 7 7
> xy[order(as.character(xy$id)), ]
id value.x value.y new.col
1 a 1 NA 1
5 b NA 5 5
2 c 3 6 6
3 d 4 8 8
6 e NA 9 9
7 f NA 7 7
4 g 7 NA 7