0

3列のテーブル(年、ID、変数)があります。個々の ID ごとに、変数列に次の年と 0 を含む新しい行を追加する必要があります。私にとって難しいのは、すべての ID の行数 (年) が異なることです。

これは 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

どんな助けでも大歓迎です。

乾杯

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 に答える