2016-07-21 170 views
0

我試圖使用readHtmlTable函數從網頁中導入表,這是數據看起來像什麼時候的第幾行在R.用R中的最後一個值替換向量中的缺失值

   Event    Athlete Country  Result Medal year 
1   100m Men    Tom Burke  USA  12.0 GOLD 1896 
2       Fritz Hofmann  DEU 12.2 est. SILVER 1896 
3        Francis Lane  USA  12.6 BRONZE 1896 
4       Alajos Szokolyi  HUN 12.6 est. BRONZE 1896 
5   400m Men    Tom Burke  USA  54.2 GOLD 1896 
6       Herbert Jamison  USA   n/a SILVER 1896 
7       Charles Gmelin  GBR   n/a BRONZE 1896 
8   800m Men   Teddy Flack  AUS  2:11.0 GOLD 1896 
9       Nֳ¡ndor Dֳ¡ni  HUN 2:11.8 est. SILVER 1896 
10      Demitrios Golemis  GRE   n/a BRONZE 1896 

現在,如果你看一下事件欄中就可以看到該事件的某些領域的空白行,這是該表是網站上的方式,我所尋找的是最有效的方式填補這些空白,所以最終它應該看起來像這樣

   Event  Athlete  Country  Result Medal year 
1   100m Men  Tom Burke  USA  12.0 GOLD 1896 
2   100m Men  Fritz Hofmann DEU 12.2 est. SILVER 1896 
3   100m Men  Francis Lane USA  12.6 BRONZE 1896 
4   100m Men  Alajos Szokolyi HUN 12.6 est. BRONZE 1896 
5   400m Men  Tom Burke  USA  54.2 GOLD 1896 

基本上永遠y時間事件列中的字段爲空我需要用非空的最後一個值填充它。該列保存在R中作爲一個因素,我知道技術上我可以使用for循環執行此操作並遍歷所有向量元素,但考慮到此表中約有300000行的胖子,這非常耗時。我希望的東西更有效

+5

裝滿NA空字段,然後使用'na.locf'從動物園包。見庫(動物園); ?na.locf'幫助和谷歌的'na.locf'找到許多其他的例子。 –

回答

1

這裏的purrr包是如何被用來解決您的問題玩具例子,假設數據是在data.frame和缺失值是NA

library(purrr) 

df <- data.frame("event" = c(1, NA, 2, NA, 3, NA, 5), "other" = 1:7) 

df 
#  event other 
# 1  1  1 
# 2 NA  2 
# 3  2  3 
# 4 NA  4 
# 5  3  5 
# 6 NA  6 
# 7  5  7 


df$event <- accumulate(.x = df$event, .f = function(x, y) { if(is.na(y)) x else y }) 

df 
#  event other 
# 1  1  1 
# 2  1  2 
# 3  2  3 
# 4  2  4 
# 5  3  5 
# 6  3  6 
# 7  5  7 
0

這裏是使用rleinverse.rle鹼R法:

# create run length encoding 
temp <- rle(df$event) 
# fill in missing values with previous values 
temp$values[is.na(temp$values)] <- temp$values[which(is.na(temp$values))-1] 

# fill in vector of data.frame 
df$event <- inverse.rle(temp) 

注意,如果在變量的第一位置的缺失值,這將無法工作。

1

來自R Studio包tidyrfill函數被設計用來做這種數據清理。我們將使用dplyr包中的mutate,它將首先用NA替換缺失值。您的數據是在數據幀df代碼看起來像

library(dplyr) 
library(tidyr) 
df_fill <- df %>% mutate(Event = ifelse(Event == "", NA,Event)) %>% 
        fill(Event) 
相關問題