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

时间:2016-09-28 12:26:57

标签: 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))

我写了myf以返回TRUEage == 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

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

编辑:这是一个人为的简化示例。实际上,我的函数里面的逻辑要复杂得多。

我的询问动机:

  • 我认为我应该更喜欢isTRUE(all.equal())而不是==,因为那是R的做法。

Reference 1Reference 2

  

对于数值和复数值,请记住==和!=不允许分数的有限表示,也不允许舍入误差。使用具有相同的all.equal几乎总是优选的。参见示例。

2 个答案:

答案 0 :(得分:3)

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

integer提供dplyr函数,该函数基本上是与near一起使用的all.equal的矢量化版本。

mutate

答案 1 :(得分:2)

作为@DavidArenburg saidall.equal()未进行矢量化。

以下代码可以使用:

mutate(patientdata, isAge34 = age == 34)
相关问题