0

我有一个 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

任何帮助将不胜感激。

干杯

4

3 回答 3

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]
于 2013-01-07T04:43:49.183 回答
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
于 2013-01-07T04:39:07.960 回答
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
于 2013-09-19T20:10:03.467 回答