У меня есть следующая пользовательская функция
vareas1 <- function(a, b, c) {
case_when(a == 1 ~ "top",
b == 1 ~ "left",
c == 1 ~ "right",
near(a, 1/3) && near(b, 1/3) && near(c, 1/3) ~ "centre"
)
}
test2 <- vareas1(1/3, 1/3, 1/3)
правильно оценивается как
[1] "centre
.
Однако, когдаприменяя его с помощью mutate из dplyr, иногда он создает NAПример:
test1 <- data.frame("a" = c(1, 0, 0, 1/3),
"b" = c(0, 1, 0, 1/3),
"c" = c(0, 0, 1, 1/3)) %>% mutate(area1 = vareas1(a, b, c))
Это приводит к:
a b c area1
1 1.0000000 0.0000000 0.0000000 top
2 0.0000000 1.0000000 0.0000000 left
3 0.0000000 0.0000000 1.0000000 right
4 0.3333333 0.3333333 0.3333333 <NA>
NA в строке [4] вместо результата "center" был неожиданным, и я не понимаю, откуда он взялся.
Я подумал, что это может быть связано с классом столбцов a, b и c, и я адаптировал функцию
vareas1_int <- function(a, b, c) {
case_when(a == as.integer(1 * 10e6) ~ "top",
b == as.integer(1 * 10e6) ~ "left",
c == as.integer(1 * 10e6) ~ "right",
near(a, as.integer(1/3 * 10e+6) &&
near(b, as.integer(1/3 * 10e+6)) &&
near(c, as.integer(1/3 * 10e+6))) ~ "centre"
)
}
и изменил a, b, c для подгонки целых чисел:
test1 <- test1 %>%
mutate(a_mil = as.integer(a * 10e+6),
b_mil = as.integer(b * 10e+6),
c_mil = as.integer(c * 10e+6))
Но результат был тот же:
a b c area1 a_mil b_mil c_mil area_int
1 1.0000000 0.0000000 0.0000000 top 10000000 0 0 top
2 0.0000000 1.0000000 0.0000000 left 0 10000000 0 left
3 0.0000000 0.0000000 1.0000000 right 0 0 10000000 right
4 0.3333333 0.3333333 0.3333333 <NA> 3333333 3333333 3333333 <NA>
Спасибо за вашу помощь!
(Этот похожий пост не покрывает моювопрос.)