2017-03-03 176 views
0

我有一個數據幀,看起來像這樣:R:與前值填補缺失值

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> 

我想填補<NA>與以前的非缺失縣名的值。換句話說,我想這結束了:

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 

到目前爲止,我一直在每個值循環遍歷d$county,更新一個臨時變量與每一個非空縣城值的名稱,並補充各細胞。這對於大型數據幀來說非常緩慢。我寧願在dplyr中這樣做,儘管我也對任何其他解決方案開放。

+1

也與此有關 - http://stackoverflow.com/questions/2776135/last-observation-carried-forward -in-a-data-frame – thelatemail

回答

2

使用tidyr我們可以使用fill(data, vars)

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

僅供參考,'tidyr :: fill()'是用C++編寫的,在我的經驗中,它的速度比通過R循環進行等效操作快幾個數量級。 – jdobres

+0

@jdobres - 公平地說,沒有人會在大數據的標準R循環中做到這一點,除非他們在折磨自己。 – thelatemail

+0

取決於「大」意味着什麼。我在一個小數據集上進行滾動填充操作,其中有大約十幾個列和大約10萬行,我認爲這不會花費太長時間。花了幾個小時。 'dplyr :: fill()'在幾秒鐘內完成了相同的操作。 – jdobres

1

我們可以使用na.locf

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

這是接受的答案http://stackoverflow.com/questions/7735647/replacing-nas-with-latest-non-na-value – jogo

+0

@jogo我沒有檢查鏈接,而回答這個問題 – akrun