如何通过R中的不同值合并两个数据集?

时间:2011-12-14 13:37:54

标签: r merge

我有两个数据集,想要合并它们。我如何仅向第一个数据集添加第二个中不在第一个数据集中的行?

如果该值不存在于另一个数据集中,则仅添加到最终数据集。示例数据集:

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

3 个答案:

答案 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