如何根据谓词轻松地将列表的元素或向量更改为NAs

我需要在单个调用中完成此操作,以便在dplyr::mutate调用等中顺利集成...

预期输出:

make_na(1:10,`>`,5)
# [1]  1  2  3  4  5 NA NA NA NA NA

my_list <- list(1,"a",NULL,character(0))
make_na(my_list, is.null)
# [[1]]
# [1] 1
#
# [[2]]
# [1] "a"
#
# [[3]]
# [1] NA
#
# [[4]]
# character(0)


注意:

我已经找到了一个解决方案,所以我回答了我的问题,但很高兴获得替代解决方案。也可能此功能已经存在于base R中或打包在显着的库中

受到我对my answer to this post的挫败感的启发

最佳答案

我们可以构建以下功能:

make_na <- function(.x,.predicate,...) {
  is.na(.x) <- sapply(.x,.predicate,...)
  .x
}


或者更好地利用purrr的魔力:

make_na <- function(.x,.predicate,...) {
  if (requireNamespace("purrr", quietly = TRUE)) {
    is.na(.x) <- purrr::map_lgl(.x,.predicate,...)
  } else {
    if("formula" %in% class(.predicate))
      stop("Formulas aren't supported unless package 'purrr' is installed")
    is.na(.x) <- sapply(.x,.predicate,...)
  }
  .x
}


这样,如果库purrr::map_lgl可用,我们将使用purrr,否则将使用sapply

一些例子 :

make_na <- function(.x,.predicate,...) {
  is.na(.x) <- purrr::map_lgl(.x,.predicate,...)
  .x
}


一些用例:

make_na(1:10,`>`,5)
# [1]  1  2  3  4  5 NA NA NA NA NA

my_list <- list(1,"a",NULL,character(0))
make_na(my_list, is.null)
# [[1]]
# [1] 1
#
# [[2]]
# [1] "a"
#
# [[3]]
# [1] NA
#
# [[4]]
# character(0)

make_na(my_list, function(x) length(x)==0)
# [[1]]
# [1] 1
#
# [[2]]
# [1] "a"
#
# [[3]]
# [1] NA
#
# [[4]]
# [1] NA


如果安装了purrr,我们可以使用以下简短格式:

make_na(my_list, ~length(.x)==0)

关于r - 使元素NA取决于谓词函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50665776/

10-12 17:48