【问题标题】:How to merge two datasets by the different values in R?如何通过 R 中的不同值合并两个数据集?
【发布时间】:2011-12-14 13:37:53
【问题描述】:

我有两个数据集,想合并它们。我如何只将第二个中的行添加到第一个数据集中,而不是第一个?

仅当另一个数据集中不存在该值时才添加到最终数据集中。示例数据集:

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

【问题讨论】:

  • 请提供示例数据集。这将大大减少我们为您提供答案的工作......
  • @PaulHiemstra 我添加了一个示例数据集。
  • 编辑了您的问题以使示例数据集在 R 中可粘贴
  • 您能简单地 rbind(或 plyr::rbind.fill)不在数据框中的行吗?这个问题类似。 stackoverflow.com/questions/3171426/…
  • 如何在您想要的结果中获得b=2g=6?不应该是b=5g=7吗?

标签: r merge


【解决方案1】:

使用!%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

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

      您已经回答了自己的问题,只是没有立即意识到。 :)

      > 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 合并了data.frames,如果缺少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
      

      【讨论】:

      • 我编辑了我提供的数据集,出现了错误。 id 相同,但相同 id 的值不同。我只想按字母合并。
      • 我认为这仍然是函数的作用?您会收到多个“d”条目...
      • 如果在要合并的 2 个数据集中有多个具有相同名称的此类变量,您将如何处理。例如。如果您在 SAS 中合并数据集,同名变量很容易合并为一个变量。在 R 中也有任何直接的方法吗?
      • @Shreyes 是否愿意将其作为问题发布?随意借用此答案中的任何代码。
      猜你喜欢
      • 2018-06-17
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 2014-08-13
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      相关资源
      最近更新 更多