为什么 all.equal 在 dplyr 的 mutate 函数中不起作用?

Jim*_* G. 3 r dplyr

考虑以下代码:

library(dplyr)       
patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52)
diabetes <- c("Type1", "Type2", "Type1", "Type1")
status <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(patientID, age, diabetes, status)
myf <- function(patientID, age, diabetes, status) { isTRUE(all.equal(age, 34))}
mutate(patientdata, isAge34 = myf(patientID, age, diabetes, status))
Run Code Online (Sandbox Code Playgroud)

我写信myf返回TRUEwhere 行age == 34,但这不起作用:

  patientID age diabetes    status isAge34
1         1  25    Type1      Poor   FALSE
2         2  34    Type2  Improved   FALSE
3         3  28    Type1 Excellent   FALSE
4         4  52    Type1      Poor   FALSE
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?我做错了什么吗?


编辑:这是一个人为的简化示例。实际上,我的函数内部有更复杂的逻辑。

我问的动机:

  • 我认为我应该更喜欢isTRUE(all.equal())==因为这是 R 做事的方式。

参考文献1参考文献2

对于数值和复数值,请记住 == 和 != 不允许分数的有限表示,也不允许舍入误差。使用 all.equal 和 same 几乎总是可取的。请参阅示例。

mik*_*eck 5

重点all.equal是检查近似相等,最常用于浮点数。与 的比较==不会为浮点数提供可靠的结果(@Andew 的评论提供的链接对此进行了解释)。因此,接受的答案实际上并不是正确的解决方案,因为原始帖子中描述的数据框将age变量指定为numeric不是 integer!)。

dplyr提供了near函数,它基本上是all.equalmutate.

mutate(patientdata, isAge34 = near(age, 34))
Run Code Online (Sandbox Code Playgroud)