1

我不知道如何使用 recipes 包将丢失的数字变量替换为常量。

我确实考虑过使用 step_lowerimpute,但我认为我无法将它用于我的案例。step_lowerimpute 用0和阈值之间的随机数替换低于给定阈值的缺失值。在我的情况下,这是行不通的。

例如,我有一些实验室变量,如乳酸,它经常丢失。我想用极值替换缺失值,例如 -9999。

4

3 回答 3

1

您可以尝试使用该step_unknown()函数,该函数将缺失值替换NAnew_level用户可以提供的值。

于 2019-10-06T11:23:43.673 回答
0

这是我第一天看食谱包(所以也许不是最可靠的答案......)。我有同样的问题,并认为以下工作符合要求:

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()
于 2019-03-01T02:27:50.550 回答
0

为什么你特别需要食谱包来做到这一点?只需将所有 NA 替换为恒定值就可以非常容易地完成。

library(imputeTS)
na.replace(yourDataframe, fill = -9999)

其他解决方案(无需额外包装):

yourDataframe[is.na(yourDataframe)] <- -9999
于 2018-06-24T18:11:43.627 回答