if_else()`false`必须是double类型,而不是整数 - 在R中

时间:2018-06-05 20:22:41

标签: r if-statement dplyr

长串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))

我认为最容易做一个简单的可重复娱乐,所以我做了你在下面看到的,但我不能再得到错误了。知道发生了什么事吗? 为什么ifelseif_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))

1 个答案:

答案 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是双倍的。 truefalse属于不同类型,因此if_else会引发错误。

写作时:

mutate(qty = if_else(name == "Bob" & fruit == "apple", qty / 2, qty))

qty可能已经是一个双倍,因此将一个双倍除以2(一个双倍)仍然会产生一倍。 truefalse属于同一类型。因此没有错误。

话虽如此,可以使用以下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执行隐式强制,使所有内容都相同,因此当truefalse属于不同类型时,它不会引发错误。这也更危险,因为隐式强制后可能会出现意外结果。