【问题标题】:if_else() `false` must be type double, not integer - in Rif_else() `false` 必须是 double 类型,而不是整数 - 在 R 中
【发布时间】:2018-11-15 10:17:54
【问题描述】:

一长串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 不工作的情况下工作,如果我将 3 更改为 3L,为什么 if_else 可以工作? 我理解 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))

【问题讨论】:

    标签: r if-statement dplyr


    【解决方案1】:

    if_else from dplyr 是类型稳定的,这意味着它检查“真”和“假”条件是否为同一类型。如果不是,if_else 会引发错误。 Base 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(双精度数)仍会产生双精度数。 “真”和“假”是同一类型。因此没有错误。

    话虽如此,这可以通过以下typeofs 轻松检查:

    > 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”属于不同类型时,它不会抛出错误。这既方便又危险,因为在隐式强制之后可能会出现意想不到的结果。

    我建议将ifelse 用于一次性/即席程序,将if_else 用于想要利用内置单元测试的优势。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多