2014-11-29 9 views
9

Moje pytanie brzmi mam dataframe m jak poniżejnapełnienia w NA na podstawie ostatniej wartości non-NA dla każdej grupy w 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 

Chcę wypełnić NA podstawie najbliższego non-NA wartość "przed" tą NA. Moje dane wyjściowe powinny wyglądać następująco:

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 

Czy masz pomysł na wykorzystanie dplyr do osiągnięcia tego celu?

+1

'locf' nie będzie obsługiwać pozycji brakujących wartości,' nomb' nie zajmie kończyć się brakujące wartości ... jeśli masz grupę wszystko z brakujących wartości, co ani wola praca ... –

+0

Dobra sprawa, ale nie wiemy jeszcze, czy te pojawiają się w kontekście PO, czy nie. Ponieważ mówią "przed", brzmi to tak, jak nie, ale tylko OP może powiedzieć na pewno. Rozwiązanie poniżej (i powiązane) działa na przykładzie OP. Nieco przylegające rozwiązanie użyłoby dwukrotnie 'zoo :: na.locf', zi bez' fromLast'. –

Odpowiedz

18

Być może wcześniej udzielono odpowiedzi, ale nie wiem, czy odpowiedź została udzielona w kontekście dplyr. zoo::na.locf() jest twoim przyjacielem:

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

ooops, zajęło około tej samej długości czasu, aby odpowiedzieć, aby wyszukać "[r] na.locf dplyr" na SO ... –

+0

dzięki! Nigdy wcześniej nie używałam pakietu "zoo" ... dlatego nigdy o tym nie myślałem .. – MYjx

+2

nie sugeruję, że powinieneś szukać (działa to tylko wtedy, gdy wiesz, czego szukać), ale powinienem był wyszukiwać i oznaczać jako duplikat, zanim odpowiedziałem. –

Powiązane problemy