gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:17:25 24 4
gpt4 key购买 nike

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

最佳答案

if_else来自 dplyr是类型稳定的,这意味着它检查“真”和“假”条件是否是相同的类型。如果不是,if_else引发错误。 ifelse在 Base R 中没有这样做。

写作时:

mutate(n = if_else(FiscalYear == "FY2018" & Candy == "SNICKERS", n - 3, n))

我假设 n最初是整数类型,所以 "false"将是整数类型, n-3将“true”强制为 double 值,因为 3是双。 “真”和“假”是不同的类型,所以 if_else引发错误。

写作时:
mutate(qty = if_else(name == "Bob" & fruit == "apple", qty / 2, qty))
qty很可能已经是 double 值,因此将 double 值除以 2 (a double) 仍然产生一个 double。 “真”和“假”是同一类型。因此没有错误。

话虽如此,这可以通过以下 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"
ifelse from Base R 执行隐式强制,将所有内容转换为相同类型。这意味着当 "true"和 "false"属于不同类型时,它不会抛出错误。这既方便又危险,因为在隐式强制之后可能会出现意想不到的结果。

我建议使用 ifelse对于一次性/临时程序,以及 if_else当您想利用内置单元测试时。

关于r - if_else() `false` 必须是 double 型,而不是整数型 - 在 R 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50708366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com