在数据框中进行的最后一次观察
Last observation carried forward in a data frame
我在 R 包中包含的部分功能涉及用最后的 ovbservation 结转 (locf
) 填充 NAs
。 locf 应该应用于数据框中的所有列,除了我在好列下面调用的 goodcols
(即应该应用于 badcols
)。 badcols
的列名可以是任何名称。我使用下面的 locf
函数和一个 for 循环来实现这一点。但是,for 循环在使用大数据集时有点慢。任何人都可以建议更快的替代方法或其他方法来填充当前场景中的 NAs 吗?
这是一个示例数据框:
#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])
}
抱歉写了一个答案(没有足够的声誉来评论)
但是是什么阻止了你像@ProcrastinatusMaximus 所说的那样做?
(您可以在循环中包含 zoo
调用)
看起来像这样:
for (i in badcols)
{
df[,i] <- zoo::na.locf(df[,i])
}
我不确定 zoo
是否比您的实施速度更快。你得试试这个。您还可以检查 spacetime::na.locf
、imputeTS::na.locf
以查看现有 locf
实施中哪个是最快的。
我在 R 包中包含的部分功能涉及用最后的 ovbservation 结转 (locf
) 填充 NAs
。 locf 应该应用于数据框中的所有列,除了我在好列下面调用的 goodcols
(即应该应用于 badcols
)。 badcols
的列名可以是任何名称。我使用下面的 locf
函数和一个 for 循环来实现这一点。但是,for 循环在使用大数据集时有点慢。任何人都可以建议更快的替代方法或其他方法来填充当前场景中的 NAs 吗?
这是一个示例数据框:
#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])
}
抱歉写了一个答案(没有足够的声誉来评论)
但是是什么阻止了你像@ProcrastinatusMaximus 所说的那样做?
(您可以在循环中包含 zoo
调用)
看起来像这样:
for (i in badcols)
{
df[,i] <- zoo::na.locf(df[,i])
}
我不确定 zoo
是否比您的实施速度更快。你得试试这个。您还可以检查 spacetime::na.locf
、imputeTS::na.locf
以查看现有 locf
实施中哪个是最快的。