在R中按ID合并不等长的data.frames

时间:2014-04-20 14:21:10

标签: r

示例数据

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

1 个答案:

答案 0 :(得分: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