Заполнение строк значением предыдущей строки для последующих значений NA в R - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть несколько пропущенных значений в последующих строках во фрейме данных.Я хочу заменить первое пропущенное значение на не пропущенное значение в его предыдущей строке, умноженное на 3, а затем заполнить следующие значения NA, используя вновь заполненные значения в их предыдущих строках, умноженные на 3. Вот пример данных икоды:

df <- mtcars
df[c(2,3,4,5),1] <-NA

IND <- is.na(df[,1])
df[IND,1] <- df[dplyr::lead(IND,1L, F),1] * 3

Последняя строка вышеуказанных кодов выполняет свою работу, но строка за строкой (я должен выполнить ее 4 раза, чтобы заполнить 4 пропущенных строки).Как я могу сделать это один раз для всех четырех пропущенных строк?

Я хочу:

df[c(2,3,4,5),1] <- c(63,189,567,1701)

, используя один цикл вместо использования вышеуказанного кода четыре раза.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Вот цикл for, который должен добиться цели:

for(i in 1:nrow(df)){
  if(!is.na(df[i,1])){
    xx <- df[i,1] 
  }
   if(is.na(df[i,1]))
    df[i,1] <-xx
  }
}
 head(df)

Хотя, возможно, существуют более элегантные решения!

0 голосов
/ 27 сентября 2018

Попробуйте это базовое решение:

Fill <- function(x) rep(x[1], length(x)) * 3 ^ (seq_along(x) - 1)
ave(df[, 1], cumsum(!is.na(df[, 1])), FUN = Fill)

, дающее:

 [1]   21.0   63.0  189.0  567.0 1701.0   18.1   14.3   24.4   22.8   19.2
[11]   17.8   16.4   17.3   15.2   10.4   10.4   14.7   32.4   30.4   33.9
[21]   21.5   15.5   15.2   13.3   19.2   27.3   26.0   30.4   15.8   19.7
[31]   15.0   21.4

Альтернативно используйте эту версию Fill:

Fill <- function(x) cumprod(replace(x, is.na(x), 3))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...