2016-06-29 3 views
-9

Я следующий вектор:Заливка пропущенное значение на основе предыдущих значений

v <- c(2L, 2L, NA, NA, NA, NA, 8L, NA) 

Как я могу заменить недостающие значения со значением предыдущего ряда + 1, так что становится:

c(2L, 2L, 3L, 3L, 3L, 3L, 8L, 9L) 
+4

сделал вам [поиск] (http://stackoverflow.com/questions/2776135/last-observation-carried-forward-in-a-data-frame) или попробовать что-то ? – rawr

+0

В пакете 'zoo' есть инструменты для этого –

ответ

5

Как уже упоминалось, zoo имеет функцию наблюдения с продолжением наблюдения. Мы можем прибавить к нему:

library(zoo) 
v2 <- na.locf(v) 
v2[is.na(v)] <- v2[is.na(v)] + 1L 
#[1] 2 2 3 3 3 3 8 9 
+2

или в одной строке: 'ifelse (is.na (v), na.locf (v) + 1L, v)' –

+1

Другим вариантом может быть 'cummax (pmax (pmin (v, lag (v) +1, na .rm = TRUE), 0, na.rm = TRUE)) ' – akrun

0

Его не очень или эффективно, но он получает ответ, который вы хотите. Надеюсь, кто-то еще сможет опубликовать какой-нибудь хороший код, но это должно вас начать.

v <- c(2L, 2L, NA, NA, NA, NA, 8L, NA) 
last <- NA 
vec <- vector() 
for (i in 1:length(v)) { 
    cur <- v[i] 
    if (! is.na(cur)) { 
     val <- cur 
     last <- cur 
    } 
    else val <- last + 1 
    vec[i] <- val 
} 

vec 
+0

Я должен был быть более конкретным. Вы правы, это легко сделать с помощью цикла. Интересно, было ли элегантное решение с dplyr или другим пакетом. –