2017-11-09 13 views
1

私は変数を1日遅らせようとしていますが、前日には多くの観測がありません。だから私はプロセスで余分な行を追加する必要があります。 Dplyrは私を近づけますが、プロセスに新しい行を追加する方法が必要で、数千ものケースがあります。どんな考えでも大歓迎です。日ごとに変数を遅らせ、プロセスで新しい行を作成する

dat2<- 
    dat1 %>% 
    group_by(ID) %>% 
    mutate(v.L = dplyr::lead(v, n = 1, default = NA)) 
dat2 
    ID day  v v.L 
1  1  0 2.2 3.4 
2  1  1 3.4 1.2 
3  1  2 1.2 0.8 
4  1  5 0.8 NA 
5  2  1 6.4 2.0 
6  2  3 2.0 NA 

しかし、私はここで取得する必要があります:

ID<-c(1,1,1,1,2,2) 
day<-c(0,1,2,5,1,3) 
v<-c(2.2,3.4,1.2,.8,6.4,2) 
dat1<-as.data.frame(cbind(ID,day,v)) 
dat1 

    ID day v 
1 1 0 2.2 
2 1 1 3.4 
3 1 2 1.2 
4 1 5 0.8 
5 2 1 6.4 
6 2 3 2.0 

dplyrを使用すると、ここで私を取得

ID2<-c(1,1,1,1,1,2,2,2) 
day2<-c(0,1,2,4,5,1,2,3) 
v2<-c(2.2,3.4,1.2,NA,.8,6.4,NA,2) 
v2.L<-c(3.4,1.2,NA,.8,NA,NA,2,NA) 
dat3<-as.data.frame(cbind(ID2,day2,v2,v2.L)) 
dat3 

    ID2 day2 v2 v2.L 
1 1 0 2.2 3.4 
2 1 1 3.4 1.2 
3 1 2 1.2 NA 
4 1 4 NA 0.8 
5 1 5 0.8 NA 
6 2 1 6.4 NA 
7 2 2 NA 2.0 
8 2 3 2.0 NA 

答えて

2

をあなたは日のシーケンスを完了するためにtidyrパッケージからcompletefull_seqを使用することができます。あなたは最後にvv.Lの両方でNAを持つ行を削除する必要があると思います:

library(dplyr) 
library(tidyr) 

dat2 = dat1 %>% 
     group_by(ID) %>% 
     complete(day = full_seq(day,1)) %>% 
     mutate(v.L = lead(v)) %>% 
     filter(!(is.na(v) & is.na(v.L))) 


    ID day  v v.L 
    <dbl> <dbl> <dbl> <dbl> 
    1  0 2.2 3.4 
    1  1 3.4 1.2 
    1  2 1.2 NA 
    1  4 NA 0.8 
    1  5 0.8 NA 
    2  1 6.4 NA 
    2  2 NA 2.0 
    2  3 2.0 NA 
関連する問題