2014-11-29 26 views
9

La mia domanda è che ho un dataframe m come di seguitoriempimento NA in base all'ultimo valore non-NA per ogni gruppo in R

y1 =c(rep("A",5),rep("B",5)) 
y2 = rep(c(1:5),2) 
y3 = y2 
y3[c(2,7,9)]=NA 
m = data.frame(y1,y2,y3) 

    y1 y2 y3 
1 A 1 1 
2 A 2 <NA> 
3 A 3 3 
4 A 4 4 
5 A 5 5 
6 B 1 1 
7 B 2 <NA> 
8 B 3 3 
9 B 4 <NA> 
10 B 5 5 

Voglio riempire il NA in base alla più vicina non-NA valore "di fronte a" questo NA. La mia uscita dovrebbe essere simile a questo:

y1 y2 y3 y4 
1 A 1 1 1 
2 A 2 <NA> 1 
3 A 3 3 3 
4 A 4 4 4 
5 A 5 5 5 
6 B 1 1 1 
7 B 2 <NA> 1 
8 B 3 3 3 
9 B 4 <NA> 3 
10 B 5 5 5 

Qualche idea su come utilizzare dplyr per raggiungere questo obiettivo?

+1

'locf' non gestirà i valori voce mancanti, il' nomb' non gestirà trailling valori mancanti ... se avete un gruppo tutti con valori mancanti, ciò che né ci sarà lavoro ... –

+0

buon punto, ma non sappiamo ancora se questi si presentano nel contesto dell'OP o no. Dal momento che dicono "di fronte" sembra che non lo facciano, ma solo l'OP può dirlo con certezza. La soluzione seguente (e collegata) funziona per l'esempio dell'OP. Una soluzione un po 'goffa usa 'zoo :: na.locf' due volte, con e senza' fromLast'. –

risposta

18

È possibile che si sia già risposto a questa risposta, ma non so se è stata data risposta in un contesto dplyr. zoo::na.locf() è tuo amico:

m %>% group_by(y1) %>% mutate(y4=zoo::na.locf(y3)) 
+0

ooops, ha impiegato circa lo stesso tempo per rispondere alla ricerca di "[r] na.locf dplyr" su SO ... –

+0

grazie !! Non ho mai usato il pacchetto 'zoo' prima ... è per questo che non ci ho mai pensato .. – MYjx

+2

non suggerire che avresti dovuto cercare (funziona solo se sai cosa cercare), ma che avrei dovuto cercare e contrassegnato come duplicare prima di rispondere. –

Problemi correlati