2016-07-21 5 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' из пакета зоопарка. См. 'Library (зоопарк); ? na.locf'for help и google для '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

Здесь это базовый метод R с помощью rle и inverse.rle:

# 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

Функция fill от пакета R Studio tidyr предназначена для очистки данных такого типа. Мы будем использовать его с mutate из пакета dplyr, который сначала заменит отсутствующие значения NA. Ваши данные в кадре данных df Код выглядит

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