2017-03-03 5 views
0

Ich habe einen Datenrahmen, der wie folgt aussieht:R: Füllen mit früheren Werten fehlenden Wertes

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> 

Ich möchte in den <NA> mit dem Wert der vorherigen nicht fehlenden Kreisnamen füllen. Mit anderen Worten, ich möchte mit diesem am Ende:

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 

Bisher habe ich jeden Wert in d$county Schleifen über wurde, eine temporäre Variable mit dem Namen eines jeden nicht leeren Kreis Wert aktualisiert wird, und das Nachfüllen jeder Zelle. Dies ist sehr langsam mit einem großen Datenrahmen. Ich würde das lieber in dplyr machen, bin aber offen für jede andere Lösung.

+1

Ebenfalls relevant verwenden - http://stackoverflow.com/questions/2776135/last-observation-carried-forward -in-a-Datenframe – thelatemail

Antwort

2

tidyr Verwendung können wir fill(data, vars) verwenden:

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

FYI, 'tidyr :: fill()' ist in C++ geschrieben und ist meiner Erfahrung nach um Größenordnungen schneller als die äquivalente Operation über eine R-Schleife. – jdobres

+0

@jdobres - in Fairness würde niemand dies jemals in einer Standard-R-Schleife auf großen Daten tun, es sei denn, sie würden sich selbst quälen. – thelatemail

+0

Hängt davon ab, was man mit "groß" meint. Ich machte eine Rolling-Fill-Operation an einem kleinen Datensatz mit etwa einem Dutzend Spalten und etwa 100.000 Zeilen, was meiner Meinung nach nicht so lange dauern würde. Es hat Stunden gedauert. 'dplyr :: fill()' machte dasselbe in Sekunden. – jdobres

1

Wir na.locf

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

Das ist die akzeptierte Antwort in http://stackoverflow.com/questions/7735647/replacing-nas-with-latest-non-na-value – jogo

+0

@jogo Ich habe den Link nicht überprüft, während ich dies beantworte – akrun

Verwandte Themen