2017-03-03 1 views
0

J'ai un dataframe qui ressemble à ceci:: remplir valeur manquante avec les valeurs antérieures

d <- data.frame(county = c("Abilene", rep(NA, 5), "Cook", rep(NA, 4), "Blah", NA, "Allegheny", rep(NA, 3))) 

     county 
1 Abilene 
2  <NA> 
3  <NA> 
4  <NA> 
5  <NA> 
6  <NA> 
7  Cook 
8  <NA> 
9  <NA> 
10  <NA> 
11  <NA> 
12  Blah 
13  <NA> 
14 Allegheny 
15  <NA> 
16  <NA> 
17  <NA> 

Je veux remplir le <NA> avec la valeur du précédent nom du comté non manquant. En d'autres termes, je veux mettre fin à ceci:

county 
1  Abilene 
2  Abilene 
3  Abilene 
4  Abilene 
5  Abilene 
6  Abilene 
7  Cook 
8  Cook 
9  Cook 
10  Cook 
11  Cook 
12  Blah 
13  Blah 
14  Allegheny 
15  Allegheny 
16  Allegheny 
17  Allegheny 

Jusqu'à présent, je me suis mise en boucle sur toutes les valeurs dans d$county, la mise à jour d'une variable temporaire avec le nom de chaque valeur du comté non vide, et remplir chaque cellule. C'est très lent avec une grande base de données. Je préférerais le faire en dplyr, mais je suis ouvert à toute autre solution.

+1

aussi pertinente - http://stackoverflow.com/questions/2776135/last-observation-carried-forward -in-a-data-frame – thelatemail

Répondre

2

En utilisant tidyr nous pouvons utiliser fill(data, vars):

library(tidyr) 
fill(d, county) 
+1

FYI, 'tidyr :: fill()' est écrit en C++ et est, selon mon expérience, plus rapide que l'opération équivalente via une boucle R. – jdobres

+0

@jdobres - en toute justice, personne ne ferait jamais cela dans une boucle R standard sur de grandes données, à moins de se torturer. – thelatemail

+0

Dépend de ce que l'on entend par "grand". Je faisais une opération de remplissage sur un petit ensemble de données avec environ une douzaine de colonnes et environ 100k lignes, ce qui ne me semblait pas prendre autant de temps. Cela a pris des heures. 'dplyr :: fill()' a fait la même chose en secondes. – jdobres

1

Nous pouvons utiliser na.locf

library(zoo) 
na.locf(d) 
+1

C'est la réponse acceptée dans http://stackoverflow.com/questions/7735647/replacing-nas-with-latest-non-na-value – jogo

+0

@jogo Je n'ai pas vérifié le lien en répondant à cette question – akrun