相关疑难解决方法(0)

为什么这些数字不相等?

以下代码显然是错误的.有什么问题?

i <- 0.1
i <- i + 0.05
i
## [1] 0.15
if(i==0.15) cat("i equals 0.15") else cat("i does not equal 0.15")
## i does not equal 0.15
Run Code Online (Sandbox Code Playgroud)

floating-point r floating-accuracy r-faq

263
推荐指数
4
解决办法
4万
查看次数

all.equal中的舍入问题

我正在阅读The R Inferno,并遇到了一些我不理解的事情.除了Inferno的第8.2.23节之外,还有一些关于比较浮点数的好问题:问题1,问题2.

但是,我仍在使用中遇到问题all.equal.使用默认值all.equal我得到的结果(大部分)正如我所料.

> all.equal(2,1.99999997)
[1] "Mean relative difference: 1.5e-08"
> all.equal(2,1.99999998) #I expected FALSE here
[1] TRUE
> all.equal(2,1.99999999)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

我不确定为什么在1.99999998函数会返回TRUE,但这与我指定容差级别的以下行为没有关系:

> all.equal(2,1.98,tolerance=0.01) #Behaves as expected
[1] "Mean relative difference: 0.01"
> all.equal(2,1.981,tolerance=0.01) #Does not behave as expected
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

此外,

> all.equal(2,1.980000000001,tolerance=0.01)
[1] TRUE 
Run Code Online (Sandbox Code Playgroud)

但是如果我们计算:

> diff(c(1.981,2))
[1] 0.019
Run Code Online (Sandbox Code Playgroud)

显然,

> diff(c(1.981,2)) >= 0.01
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

那么,为什么all.equal无法区分2和1.981,容差为0.01?

编辑

从文档中:通过首先计算两个数值向量的平均绝对差值来完成scale = NULL(默认值)的数值比较.如果这小于容差或不是有限的,则使用绝对差异,否则相对差异按平均绝对差异缩放. …

r

9
推荐指数
2
解决办法
268
查看次数

R:找到两个向量之间的交集

v1 = c(2, 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 
  2.11, 2.12, 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 
  2.22, 2.23, 2.24, 2.25, 2.26, 2.27, 2.28, 2.29, 2.3, 2.31, 2.32, 
  2.33, 2.34, 2.35, 2.36, 2.37, 2.38, 2.39, 2.4, 2.41, 2.42, 2.43, 
  2.44, 2.45, 2.46, 2.47, 2.48, 2.49, 2.5, 2.51, 2.52, 2.53, 2.54, 
  2.55, 2.56, 2.57, 2.58, 2.59, 2.6, 2.61, 2.62, 2.63, 2.64, 2.65, 
  2.66, 2.67, 2.68, 2.69, 2.7, 2.71, 2.72, 2.73, 2.74, 2.75, 2.76, 
  2.77, …
Run Code Online (Sandbox Code Playgroud)

r vector

7
推荐指数
1
解决办法
1万
查看次数

R地狱的第一圈.0.1!= 0.3/3

可能重复:
R中的数字比较难度

大家好,

根据"R Inferno"论文.我现在正处于R地狱的第一圈.这是异教徒期望0.1 == 0.3/3的地方.Paper建议all.equal在这种情况下使用函数,但是我需要检查"> ="或"<="条件.目前他们的例子失败了:

> .1 >= .3/3
[1] TRUE
> .1 <= .3/3
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

是否有类似于all.equal的函数来检查不等式?

谢谢,

伊利亚

r inequalities

5
推荐指数
3
解决办法
1184
查看次数

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

考虑以下代码:

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 …
Run Code Online (Sandbox Code Playgroud)

r dplyr

3
推荐指数
1
解决办法
477
查看次数

R:all.equal 与 all

我试图使用 all 和 all.equal 来测试两个向量是否相等,但它们给出了不同的结果,我不确定为什么。

> x = seq(0,1,by=0.2)
> x
[1] 0.0 0.2 0.4 0.6 0.8 1.0
 > y = c(0.0, 0.2, 0.4, 0.6, 0.8, 1.0)
> all(x == y)
[1]  FALSE
> all.equal(x, y)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

r

3
推荐指数
1
解决办法
1374
查看次数

> =不工作,R

我正在运行下面的代码.函数Ax返回值1.但是ifelse语句不识别Ax == 1.

我已经尝试使函数的输出为双精度,所有数值都加倍.这没效果.

我希望:
1)帮助解决此特定情况
2)获取有关如何避免此问题的提示

Axfun<-function(beta,gamma,a,b,g,H0stud,Wh,Wi){ 
  ((b*beta + g*gamma)*(1 + 2*g*gamma)*(1 + gamma + b*((-beta)*(1 + gamma) + a*(-1 + beta)*(1 + g*gamma)))*H0stud*Wi)/
    ((-1 + b*beta)*(1 + gamma)*((-g)*gamma*(1 + 2*g*gamma)*Wi + b*beta*((-1 + g*gamma*(-2 + H0stud) + H0stud)*Wh - (1 + g*gamma)*H0stud*Wi)))
}

Ax<-Axfun(2^1,
          2^0,
          2^0,
          2^-3,
          2^-1,
          1,
          1,
          0.4)

ifelse(Ax>=1, 0, Ax)
Run Code Online (Sandbox Code Playgroud)

double logic if-statement r

0
推荐指数
1
解决办法
940
查看次数