请考虑以下代码:
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
以返回TRUE
行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
为什么这不起作用?我做错了吗?
编辑:这是一个人为的简化示例。实际上,我的函数里面的逻辑要复杂得多。
我的询问动机:
isTRUE(all.equal())
而不是==
,因为那是R的做法。对于数值和复数值,请记住==和!=不允许分数的有限表示,也不允许舍入误差。使用具有相同的all.equal几乎总是优选的。参见示例。
答案 0 :(得分:3)
all.equal
的目的是检查接近相等,最常用于浮点数。与==
的比较不会给出浮点数的可靠结果(@ Andew的评论提供的link解释了这一点)。 因此,接受的答案实际上并不是正确的解决方案,因为原始帖子中描述的数据框将age
变量指定为numeric
(不 { {1}}!)。
integer
提供dplyr
函数,该函数基本上是与near
一起使用的all.equal
的矢量化版本。
mutate
答案 1 :(得分:2)