2015-01-20 10 views
5

Diciamo che ho questo data.frame (con 3 variabili)operazione diff all'interno di un gruppo, dopo un dplyr :: group_by()

ID Period Score 
123 2013 146 
123 2014 133 
23 2013 150 
456 2013 205 
456 2014 219 
456 2015 140 
78 2012 192 
78 2013 199 
78 2014 133 
78 2015 170 

Utilizzando dplyr posso raggrupparli per ID e filtrare questi ID che apparire più di una volta

data <- data %>% group_by(ID) %>% filter(n() > 1) 

Ora, quello che mi piace di raggiungere è quello di aggiungere una colonna che è: Differenza = Punteggio di Periodo P - Punteggio di Periodo P-1 per ottenere qualcosa di simile:

ID Period Score Difference 
123 2013 146 
123 2014 133 -13 
456 2013 205 
456 2014 219 14 
456 2015 140 -79 
78 2012 192 
78 2013 199 7 
78 2014 133 -66 
78 2015 170 37 

È piuttosto banale farlo in un foglio di calcolo, ma non ho idea di come posso ottenere questo in R.
Grazie per qualsiasi aiuto o guida.

risposta

15

Ecco un'altra soluzione che utilizza lag. A seconda del caso d'uso, potrebbe essere più comodo di perché lo NAs mostra chiaramente che un particolare valore non aveva un predecessore mentre un 0 usando diff potrebbe essere il risultato di a) un predecessore mancante o di b) la sottrazione tra due periodi.

data %>% group_by(ID) %>% filter(n() > 1) %>% 
    mutate(
    Difference = Score - lag(Score) 
    ) 

# ID Period Score Difference 
# 1 123 2013 146   NA 
# 2 123 2014 133  -13 
# 3 456 2013 205   NA 
# 4 456 2014 219   14 
# 5 456 2015 140  -79 
# 6 78 2012 192   NA 
# 7 78 2013 199   7 
# 8 78 2014 133  -66 
# 9 78 2015 170   37 
+0

Grazie Alex. Mi piace molto anche questo. Quindi sì, sono d'accordo che è meglio avere NA per il primo periodo e 0 solo quando la differenza è 0. – Franky

+1

Puoi anche specificare il valore predefinito all'interno di 'lag', ad es. 'Punteggio - lag (Punteggio, default = 99)' e quale lag vuoi usare. –

Problemi correlati