添加新行,在变量列中填充连续年份和0

时间:2013-01-07 04:35:18

标签: r

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

这可能是原始表:

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 个答案:

答案 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]

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

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