2016-06-23 15 views
5

Ho problemi a cercare di ritardare la data raggruppata per gruppo.Lag/lead per gruppo in R e dplyr

dati:

df <- data.frame(Team = c("A", "A", "A", "A", "B", "B", "B", "C", "C", "D", "D"), 
      Date = c("2016-05-10","2016-05-10", "2016-05-10", "2016-05-10", 
         "2016-05-12", "2016-05-12", "2016-05-12", 
         "2016-05-15","2016-05-15", 
         "2016-05-30", "2016-05-30"), 
      Points = c(1,4,3,2,1,5,6,1,2,3,9) 
      ) 

Team  Date  Points 
A  2016-05-10  1 
A  2016-05-10  4 
A  2016-05-10  3 
A  2016-05-10  2 
B  2016-05-12  1 
B  2016-05-12  5 
B  2016-05-12  6 
C  2016-05-15  1 
C  2016-05-15  2 
D  2016-05-30  3 
D  2016-05-30  9 

Risultato atteso:

Team  Date  Points Date_Lagged 
A  2016-05-10  1   NA 
A  2016-05-10  4   NA 
A  2016-05-10  3   NA 
A  2016-05-10  2   NA 
B  2016-05-12  1  2016-05-10 
B  2016-05-12  5  2016-05-10 
B  2016-05-12  6  2016-05-10 
C  2016-05-15  1  2016-05-12 
C  2016-05-15  2  2016-05-12 
D  2016-05-30  3  2016-05-15 
D  2016-05-30  9  2016-05-15 

sto graffiare la mia testa dopo mi sono reso conto quanto segue non è la soluzione corretta:

df %>% group_by(Date) %>% mutate(Date_lagged = lag(Date)) 

Qualsiasi idea come sistemarlo?

risposta

6

Il lag compensa automaticamente con n=1. Tuttavia, abbiamo elementi duplicati per "Squadra" e "Data". Per ottenere l'output previsto, è necessario ottenere le righe distinct di "Team", "Data", creare un "Date_lagged" con lag di "Date" e right_join (o left_join) con il set di dati originale.

distinct(df, Team, Date) %>% 
     mutate(Date_Lagged = lag(Date)) %>% 
     right_join(., df) %>% 
     select(Team, Date, Points, Date_Lagged) 
# Team  Date Points Date_Lagged 
#1  A 2016-05-10  1  <NA> 
#2  A 2016-05-10  4  <NA> 
#3  A 2016-05-10  3  <NA> 
#4  A 2016-05-10  2  <NA> 
#5  B 2016-05-12  1 2016-05-10 
#6  B 2016-05-12  5 2016-05-10 
#7  B 2016-05-12  6 2016-05-10 
#8  C 2016-05-15  1 2016-05-12 
#9  C 2016-05-15  2 2016-05-12 
#10 D 2016-05-30  3 2016-05-15 
#11 D 2016-05-30  9 2016-05-15 

Oppure possiamo anche fare

df %>% 
    mutate(Date_Lagged = rep(lag(unique(Date)), table(Date))) 
3

Si può fare questo con base R troppo, ad esempio utilizzando rle:

with(rle(as.character(df$Date)), rep(c(NA, head(values, -1)), lengths)) 
# [1] NA   NA   NA   NA   "2016-05-10" "2016-05-10" 
# [7] "2016-05-10" "2016-05-12" "2016-05-12" "2016-05-15" "2016-05-15" 
Problemi correlati