在 mutate/case_when 中使用自定义矢量化函数时出错
Error in using custom vectorized function in mutate/case_when
下面是重现错误的简单代码。我定义了一个简单的函数,使用 purrr::map
将其与另一个函数向量化,然后尝试在 mutate case_when 中使用它,其中条件通常应确保参数有效。错误发生在条件 if(arg1 > 0)
当 arg1 = NA
时,但我不明白为什么会发生这种情况。如果我应用过滤器,错误就会消失。有谁知道我做错了什么?我的感觉是它应该有效。
require(tidyverse)
f_single <- function(arg1, arg2) {
if (arg1 > 0) {
return(arg1 * arg2)
}
}
f_vector <- function(arg1, arg2) {
result <- map2_dbl(arg1, arg2, f_single)
return(result)
}
x <- tribble(~ arg1, ~ arg2,
NA, 1,
2, 3,
4, 5,)
x %>%
# filter(!is.na(arg1)) %>%
mutate(y = case_when(arg1 > 0 ~ f_vector(arg1, arg2)))
错误如下:
Error in `mutate()`:
! Problem while computing `y = case_when(arg1 > 0 ~ f_vector(arg1, arg2))`.
Caused by error in `if (arg1 > 0) ...`:
! missing value where TRUE/FALSE needed
两期:
- 将
NA
传递给 if
语句将引发错误。您可以通过使用 isTRUE
. 包装条件来避免这种情况
- 你的代码仍然会抛出错误,因为
f_single
returns NULL
when arg1
is missing or <= 0, but map_*
expects每个输入的 return 值。
如下更改 f_single
将解决这两个问题:
f_single <- function(arg1, arg2) {
if (isTRUE(arg1 > 0)) {
arg1 * arg2
} else {
NA_real_
}
}
# rest of code unchanged from original
# # A tibble: 3 x 3
# arg1 arg2 y
# <dbl> <dbl> <dbl>
# 1 NA 1 NA
# 2 2 3 6
# 3 4 5 20
下面是重现错误的简单代码。我定义了一个简单的函数,使用 purrr::map
将其与另一个函数向量化,然后尝试在 mutate case_when 中使用它,其中条件通常应确保参数有效。错误发生在条件 if(arg1 > 0)
当 arg1 = NA
时,但我不明白为什么会发生这种情况。如果我应用过滤器,错误就会消失。有谁知道我做错了什么?我的感觉是它应该有效。
require(tidyverse)
f_single <- function(arg1, arg2) {
if (arg1 > 0) {
return(arg1 * arg2)
}
}
f_vector <- function(arg1, arg2) {
result <- map2_dbl(arg1, arg2, f_single)
return(result)
}
x <- tribble(~ arg1, ~ arg2,
NA, 1,
2, 3,
4, 5,)
x %>%
# filter(!is.na(arg1)) %>%
mutate(y = case_when(arg1 > 0 ~ f_vector(arg1, arg2)))
错误如下:
Error in `mutate()`:
! Problem while computing `y = case_when(arg1 > 0 ~ f_vector(arg1, arg2))`.
Caused by error in `if (arg1 > 0) ...`:
! missing value where TRUE/FALSE needed
两期:
- 将
NA
传递给if
语句将引发错误。您可以通过使用isTRUE
. 包装条件来避免这种情况
- 你的代码仍然会抛出错误,因为
f_single
returnsNULL
whenarg1
is missing or <= 0, butmap_*
expects每个输入的 return 值。
如下更改 f_single
将解决这两个问题:
f_single <- function(arg1, arg2) {
if (isTRUE(arg1 > 0)) {
arg1 * arg2
} else {
NA_real_
}
}
# rest of code unchanged from original
# # A tibble: 3 x 3
# arg1 arg2 y
# <dbl> <dbl> <dbl>
# 1 NA 1 NA
# 2 2 3 6
# 3 4 5 20