r - 当函数返回 NULL 时防止 purrr::map 错误
问题描述
我想在这样的数据集上使用 map_chr 函数
library(purrr)
library(dplyr)
f <- function(x) if(x == "a") NULL else "blah"
f("a") # returns NULL
# make tibble
mytib <- tibble(test = c("a", "b"))
# naive map_chr
mytib %>% mutate(getf = map_chr(test, f))
# with .default
mytib %>% mutate(getf = map_chr(test, f, .default = NA_character_))
如您所见, map_chr 失败并显示错误消息Error: Problem with `mutate()` input `getf`. x unused argument (.default = NA)
。
如其他地方描述的可能和 na_if 的尝试对我也不起作用。
如何让 map_chr 遍历参数并将 NULL 值保留为 NA_character_ 或其他值?
解决方案
f
定义返回可能会更好NA_character_
f <- function(x) if(x == "a") NA_character_ else "blah"
然后OP的调用按预期工作
或者不是循环,而是创建一个矢量化函数
f <- function(x) case_when(x != 'a' ~ 'blah')
然后调用为
mytib %>%
mutate(getf = f(test))
或者另一个选项,如果f
已经定义为 return NULL
,则连接NA
并提取第一个元素。 NULL
没有任何length
,所以只与NA
返回连接NA
c(NULL, NA_character_)
#[1] NA
mytib %>%
mutate(getf = map_chr(test, ~ c(f(.x), NA_character_)[1]))
# A tibble: 2 x 2
# test getf
# <chr> <chr>
#1 a <NA>
#2 b blah
索引是提取那些有实际值 'blah' 返回的[1]
情况,以便我们只选择第一个元素,即 'blah' 而对于那些if
条件为 is的情况TRUE
,无论如何它只会返回 NA_character_
推荐阅读
- python-3.x - 编译的 Python 函数 Executable 不是单个文件并且不运行
- r - 在 df2 中识别 df1 中的元素,然后在 df2 中使用 R 重合的那些行中添加列
- laravel - Laravel Socialite Github 提供商电子邮件为空
- javascript - 动态更改占位符文本
- java - 将场景从一个包切换到另一个包 javafx
- c++ - 需要对使用 BST 的电话簿上的 c++ 项目进行一些澄清
- angular - 模块错误(来自 ./node_modules/postcss-loader/src/index.js):(发出的值而不是错误的实例)CssSyntaxError
- spring-boot - 从 Spring Boot 发送带有 logback 的无代理日志时,如何为 datadog 定义源标签?
- excel - 如何根据 2 张纸计算行数
- flutter - 如何在 Flutter 中以 24 小时格式显示当前时间,而不使用 AM 或 PM?