示例数据
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
答案 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