长串dplyr管道的末尾是
mutate(n = if_else(FiscalYear == "FY2018" & Candy == "SNICKERS", n - 3, n))
给出了这个错误
Error in mutate_impl(.data, dots) : Evaluation error: `false` must be type double, not integer.
如果我改为这两个中的任何一个,那就会消失
mutate(n = ifelse(FiscalYear == "FY2018" & Candy == "SNICKERS", n - 3, n))
mutate(n = if_else(FiscalYear == "FY2018" & Candy == "SNICKERS", n - 3L, n))
我认为最容易做一个简单的可重复娱乐,所以我做了你在下面看到的,但我不能再得到错误了。知道发生了什么事吗? 为什么ifelse
在if_else
没有的地方工作,为什么if_else
如果我将3改为3L会有效?我理解L
强制 3是一个整数,是正确的吗?
library(tidyverse)
df <- tribble(
~name, ~fruit, ~qty,
"Bob", "apple", 10,
"Bill", "apple", 10
)
# THIS WORKS AGAIN AS IT SHOULD
df %>% mutate(qty = ifelse(name == "Bob" & fruit == "apple", qty / 2, qty))
# BUT IF_ELSE DOESN'T FAIL THIS TIME, WEIRD
df %>% mutate(qty = if_else(name == "Bob" & fruit == "apple", qty / 2, qty))
答案 0 :(得分:11)
if_else
的 dplyr
是类型稳定的,这意味着它会检查true和false是否为同一类型,如果不是,则会引发错误。基地R中的ifelse
不会这样做。
写作时:
mutate(n = if_else(FiscalYear == "FY2018" & Candy == "SNICKERS", n - 3, n))
我认为n
最初是一个整数类,因此false
将是整数类型,n-3
强制true
为两倍,因为3
是双倍的。 true
和false
属于不同类型,因此if_else
会引发错误。
写作时:
mutate(qty = if_else(name == "Bob" & fruit == "apple", qty / 2, qty))
qty
可能已经是一个双倍,因此将一个双倍除以2
(一个双倍)仍然会产生一倍。 true
和false
属于同一类型。因此没有错误。
话虽如此,可以使用以下typeof
s轻松检查:
> typeof(6)
[1] "double"
> typeof(6L)
[1] "integer"
> typeof(6L-3)
[1] "double"
> typeof(6L-3L)
[1] "integer"
> typeof(6/2)
[1] "double"
来自Base R的 ifelse
执行隐式强制,使所有内容都相同,因此当true
和false
属于不同类型时,它不会引发错误。这也更危险,因为隐式强制后可能会出现意外结果。