Последнее наблюдение перенесено во фрейм данных

Часть функций, которые я включаю в R-пакет, включает заполнение NAs последним перенесенным наблюдением (locf). Locf должен быть применен ко всем столбцам в фрейме данных, кроме того, что я назвал ниже хороших столбцов goodcols (т.е. должен применяться к badcols). Имена столбцов для badcols могут быть любыми. Я использую функцию locf ниже и цикл for, чтобы добиться этого. Однако цикл for работает немного медленнее при использовании большого набора данных. Может ли кто-нибудь предложить более быструю альтернативу или другой способ заполнения НП в представленном сценарии?

Вот пример фрейма данных:

#Test df
TIME <- c(0,5,10,15,20,25,30,40,50)
AMT  <- c(50,0,0,0,50,0,0,0,0)
COV1 <- c(10,9,NA,NA,5,5,NA,10,NA)
COV2 <- c(20,15,15,NA,NA,10,NA,30,NA)
ID   <- rep(1, times=length(TIME))

df <- data.frame(ID,TIME,AMT,COV1,COV2)
df <- expand.grid(df)

goodcols <- c("ID","TIME","AMT")
badcols <- which(names(df)%in%goodcols==F)

#----------------------------------------------------
#locf function
locf <- function (x) {
  good <- !is.na(x)
  positions <- seq(length(x))
  good.positions <- good * positions
  last.good.position <- cummax(good.positions)
  last.good.position[last.good.position == 0] <- NA
  x[last.good.position]
}
#------------------------------------------------------
#Now fill in the gaps by locf function
for (i in badcols)
{
  df[,i] <- locf(df[,i])
}

person daragh    schedule 03.10.2016    source источник
comment
Вы смотрели на функцию na.locf из пакета zoo?   -  person Jaap    schedule 03.10.2016
comment
Эти вопросы и ответы могут помочь, если скорость является проблемой.   -  person Jaap    schedule 03.10.2016
comment
@ProcrastinatusMaximus Дело в том, что в моем случае я знаю только то, что назвал goodcols. Имена столбцов для вменения неизвестны. Следовательно, мне нужно что-то общее, что я могу использовать; который изображен в цикле for, который у меня есть. Можно использовать na.locf, если я действительно знаю имя столбца для вменения.   -  person daragh    schedule 03.10.2016


Ответы (1)


Извините за то, что написал ответ (недостаточно репутации, чтобы просто комментировать)

Но что мешает вам сделать так, как сказал @ProcrastinatusMaximus? (вы можете включить вызов zoo в свой цикл)

Выглядело бы это так:

for (i in badcols)
{
  df[,i] <- zoo::na.locf(df[,i])
}

Я не уверен, что zoo быстрее вашей реализации. Вам нужно попробовать это. Вы также можете проверить spacetime::na.locf, imputeTS::na.locf, чтобы увидеть, какая из существующих locf реализаций является самой быстрой.

person Steffen Moritz    schedule 10.11.2016