我不知道如何使用 recipes 包将丢失的数字变量替换为常量。
我确实考虑过使用 step_lowerimpute,但我认为我无法将它用于我的案例。step_lowerimpute 用0和阈值之间的随机数替换低于给定阈值的缺失值。在我的情况下,这是行不通的。
例如,我有一些实验室变量,如乳酸,它经常丢失。我想用极值替换缺失值,例如 -9999。
我不知道如何使用 recipes 包将丢失的数字变量替换为常量。
我确实考虑过使用 step_lowerimpute,但我认为我无法将它用于我的案例。step_lowerimpute 用0和阈值之间的随机数替换低于给定阈值的缺失值。在我的情况下,这是行不通的。
例如,我有一些实验室变量,如乳酸,它经常丢失。我想用极值替换缺失值,例如 -9999。
您可以尝试使用该step_unknown()
函数,该函数将缺失值替换NA
为new_level
用户可以提供的值。
这是我第一天看食谱包(所以也许不是最可靠的答案......)。我有同样的问题,并认为以下工作符合要求:
rec <-
recipe( ~ ., data = airquality) %>%
step_mutate(
Ozone = tidyr::replace_na(Ozone, -9999)
) %>%
prep(training = airquality, retain = TRUE)
juice(rec)
在遇到这种方法之前,我也尝试过创建自己的步骤,这似乎也有效,但上面要简单得多......
step_nareplace <-
function(recipe,
...,
role = NA,
trained = FALSE,
skip = FALSE,
columns = NULL,
replace = -9,
id = rand_id("nareplace")) {
add_step(
recipe,
step_nareplace_new(
terms = ellipse_check(...),
role = role,
trained = trained,
skip = skip,
id = id,
replace = replace,
columns = columns
)
)
}
step_nareplace_new <-
function(terms, role, trained, skip, id, columns, replace) {
step(
subclass = "nareplace",
terms = terms,
role = role,
trained = trained,
skip = skip,
id = id,
columns = columns,
replace = replace
)
}
prep.step_nareplace <- function(x, training, info = NULL, ...) {
col_names <- terms_select(x$terms, info = info)
step_nareplace_new(
terms = x$terms,
role = x$role,
trained = TRUE,
skip = x$skip,
id = x$id,
columns = col_names,
replace = x$replace
)
}
bake.step_nareplace <- function(object, new_data, ...) {
for (i in object$columns) {
if (any(is.na(new_data[, i])))
new_data[is.na(new_data[, i]), i] <- object$replace
}
as_tibble(new_data)
}
print.step_nareplace <-
function(x, width = max(20, options()$width - 30), ...) {
cat("Replacing NA values in ", sep = "")
cat(format_selectors(x$terms, wdth = width))
cat("\n")
invisible(x)
}
tidy.step_nareplace <- function(x, ...) {
res <- simple_terms(x, ...)
res$id <- x$id
res
}
recipe(Ozone ~ ., data = airquality) %>%
step_nareplace(Ozone, replace = -9999) %>%
prep(airquality, verbose = FALSE, retain = TRUE) %>%
juice()
为什么你特别需要食谱包来做到这一点?只需将所有 NA 替换为恒定值就可以非常容易地完成。
library(imputeTS)
na.replace(yourDataframe, fill = -9999)
其他解决方案(无需额外包装):
yourDataframe[is.na(yourDataframe)] <- -9999