如何根据谓词轻松地将列表或向量的元素更改为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)
注意:的
我回答了我的问题,因为我找到了一个解决方案,但我很乐意得到其他解决方案。也许这个功能已经存在于基础R中或打包在一个着名的库中
中的挫败感的启发答案 0 :(得分:1)
我们可以建立以下功能:
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)