Функция / цикл для замены NA значениями в соседних столбцах в R

У меня есть набор данных временного ряда с 1000 столбцами. Каждый ряд, конечно, отдельная запись. Есть некоторые значения NA, которые разбросаны по всему набору данных.

Я хотел бы заменить каждый NA либо соседним левым значением, либо соседним правым значением, не важно, какой.

Оптимальное решение, к которому я стремился, состоит в том, чтобы заменить каждый NA значением справа от него, если только он не находится в последнем столбце, и в этом случае заменить его значением слева от него.

Я только собирался сделать цикл for, но я предполагаю, что функция будет более эффективной. По сути, я не был уверен, как ссылаться на смежные значения.

Вот что я пытался:

for (entry in dataset) {
  if (any(is.na(entry)) == TRUE && entry[,1:999]) {
    entry = entry[,1]
  }
  else if (any(is.na(entry)) == TRUE && entry[,1000]) {
    entry = cell[,-1]
  }
}

Как вы можете сказать, я неопытен с R :) Не совсем уверен, как вы индексируете значения влево или вправо.

 Pierre Lafortune19 июл. 2016 г., 19:11
Вопрос вновь открыт
 Pierre Lafortune19 июл. 2016 г., 18:11
Небольшой пример будет иметь большое значение

Ответы на вопрос(1)

Решение Вопроса

na.locf на транспонированном из вашего набора данных.

Функция na.locfzoo Пакет предназначен для заменыNA по ближайшему значению (+1 или -1 в той же строке). Поскольку вам нужны столбцы, мы можем сначала перенести набор данных:

library(zoo)
df=matrix(c(1,3,4,10,NA,52,NA, 11, 100), ncol=3)
step1 <-  t(na.locf(t(df), fromLast=T))
step2 <-  t(na.locf(t(step1), fromLast=F))
print(df)
#### [1,]    1   10   NA
#### [2,]    3   NA   11
#### [3,]    4   52  100
print(step2)
#### [1,]    1   10   10
#### [2,]    3   11   11
#### [3,]    4   52  100

Я делаю это в 2 шага, так как есть разные способы обработки внутренних и последних столбцов. Если вы знаетеdplyr упаковать его еще проще, чтобы превратить его в функцию:

library(dplyr)
MyReplace = function(data) {data %>% t %>% na.locf(.,,T) %>% na.locf %>% t}
MyReplace(df)
 WΔ_19 июл. 2016 г., 19:18
работал шарм!

Ваш ответ на вопрос