2013-01-07 16 views
0

我有一个3列表(年份,ID,变量)。对于每个个人ID,我需要在下一年添加一个新行,并在变量列中添加一个0。我的困难是每个ID都有不同的行数(年)。添加新行,填充连续的年份和0的变量列

这是5月原表:

ID year var 
1 1998 2 
1 1999 5 
1 2000 6 
1 2001 6 
1 2002 6 
2 1998 12 
2 1999 12 
3 1998 5 
3 1999 5 
3 2000 4 

...这就是我需要:

ID year var 
1 1998 2 
1 1999 5 
1 2000 6 
1 2001 6 
1 2002 6 
1 2003 0 
2 1998 12 
2 1999 12 
2 2000 0 
3 1998 5 
3 1999 5 
3 2000 4 
3 2001 0 

任何帮助将不胜感激。

干杯

回答

3

获取数据:

test <- read.table(textConnection("ID year var 
1 1998 2 
1 1999 5 
1 2000 6 
1 2001 6 
1 2002 6 
2 1998 12 
2 1999 12 
3 1998 5 
3 1999 5 
3 2000 4"),header=TRUE) 

添加的行中:

do.call(rbind,by(test,test$ID,function(x) rbind(x,c(x$ID[1],max(x$year)+1,0)))) 

结果:

 ID year var 
1.1 1 1998 2 
1.2 1 1999 5 
1.3 1 2000 6 
1.4 1 2001 6 
1.5 1 2002 6 
1.6 1 2003 0 
2.6 2 1998 12 
2.7 2 1999 12 
2.3 2 2000 0 
3.8 3 1998 5 
3.9 3 1999 5 
3.10 3 2000 4 
3.4 3 2001 0 
5

一个data.table溶液(语法超过内存效率)

library(data.table) 
# assuming your data is in the data.frame dd 
DT <- data.table(dd) 

DT[,list(year = c(year,max(year)+1), var = c(var,0)),by = ID] 
+0

非常感谢! – Rafael

1

这里的另一个解决方案只使用基础包

DF <- read.table(textConnection("ID year var 
1 1998 2 
1 1999 5 
1 2000 6 
1 2001 6 
1 2002 6 
2 1998 12 
2 1999 12 
3 1998 5 
3 1999 5 
3 2000 4"), header=TRUE) 

foo <- split(DF, DF["ID"]) 
addone <- function(x){ 
    last <- tail(x,1) 
    last$year<-last$year+1 
    last$var <- 0 
    rbind(x,last) 
    } 
do.call(rbind, lapply(foo, addone)) 

...和输出:

 ID year var 
1.1 1 1998 2 
1.2 1 1999 5 
1.3 1 2000 6 
1.4 1 2001 6 
1.5 1 2002 6 
1.51 1 2003 0 
2.6 2 1998 12 
2.7 2 1999 12 
2.71 2 2000 0 
3.8 3 1998 5 
3.9 3 1999 5 
3.10 3 2000 4 
3.101 3 2001 0 
+0

非常感谢您的建议! – Rafael