最后的观察结果在数据框架中进行

时间:2016-10-03 05:58:33

标签: r locf

我在R包中包含的一部分功能涉及填充NAs并结束最后一次保存(locf)。 locf应该被实现到数据框中的所有列,除了我在好列goodcols下面调用的那些(即应该应用于badcols)。 badcols的列名可以是任何内容。我使用下面的locf函数和for循环来实现这一点。但是,使用大数据集时,for循环有点慢。在所呈现的场景中,任何人都可以提出更快的替代方案或其他填充NA的方法吗?

以下是一个示例数据框:

#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])
}

1 个答案:

答案 0 :(得分:2)

很抱歉写了一个答案(没有足够的声誉来评论)

但是什么阻止你做@ProcrastinatusMaximus说的? (您可以在循环中包含zoo调用)

看起来像这样:

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

我不确定zoo是否比您的实施更快。你必须试试这个。您还可以检查spacetime::na.locfimputeTS::na.locf,了解哪些现有locf实施最快。