【问题标题】:Merge unequal length data.frames by id in R在R中按id合并不等长度的data.frames
【发布时间】:2014-04-20 14:21:10
【问题描述】:

样本数据

x <- data.frame(id=c(1,1,1,2,2,7,7,7,7),dna=c(232,424,5345,45345,45,345,4543,345345,4545))

y <- data.frame(id=c(1,1,1,2,2,7,7,7,7),year=c(2001,2002,2003,2005,2006,2000,2001,2002,2003))

合并没有给出好的解决方案merge(x,y,by="id"),它给出了重复。

现在对于上面的示例数据,简单的 cbind 工作 cbind(x,y) 这就是我所追求的,只需将 year 与相应的 id 配对。

当两个 data.frames 不匹配时就会出现问题!这样包含变量year 的data.frame 会更短。像这样的:

x <- data.frame(id=c(1,1,1,2,2,7,7,7,7),dna=c(232,424,5345,45345,45,345,4543,345345,4545))

y <- data.frame(id=c(1,1,1,2,2,7,7,7),year=c(2001,2002,2003,2005,2006,2000,2001,2002))

所以我需要对两个 data.frames 进行配对,并且 data.frame x 的相应不匹配行可能是 NA,以便我删除该行。

较短样本数据的期望输出:

     id year dna
  1  1 2001 232
  2  1 2002 424
  3  1 2003 5345
  4  2 2005 45345
  5  2 2006 45
  6  7 2000 345
  7  7 2001 4543
  8  7 2002 345345

【问题讨论】:

    标签: r


    【解决方案1】:

    您应该为每个 id 添加一个记录号,以便您可以使用merge

    x <- transform(x, rec = ave(id, id, FUN = seq_along))
    y <- transform(y, rec = ave(id, id, FUN = seq_along))
    
    merge(x, y, c("id", "rec"))
    #   id rec    dna year
    # 1  1   1    232 2001
    # 2  1   2    424 2002
    # 3  1   3   5345 2003
    # 4  2   1  45345 2005
    # 5  2   2     45 2006
    # 6  7   1    345 2000
    # 7  7   2   4543 2001
    # 8  7   3 345345 2002
    

    【讨论】:

      猜你喜欢
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多