我有一个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
任何帮助将不胜感激。
干杯
答案 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