浮点数对等问题(我认为)

时间:2019-09-29 21:58:44

标签: r dplyr

我已经读到==在浮点运算上有麻烦。例如:

74.2+53.2
[1] 127.4
74.2+53.2==127.4
[1] TRUE

74.2+153.2
[1] 227.4
74.2+153.2==227.4
[1] FALSE

isTRUE和all.equal

isTRUE(all.equal(74.2+153.2, 227.4))
[1] TRUE

使用dplyrgroup_by变量,然后将summarise的一个变量设为sum,将另一个变量的max用作变量,然后查找等效项。

首先是一个工作示例:74.2 + 53.2 = 127.4

library(dplyr)
df<-tibble(group=c(  1,     2,     2,   3),
           B=    c(1.0,  74.2,  53.2, 1.0),
           C=    c(  2, 127.4, 127.4, 1.0))
df %>% 
  group_by(group) %>% 
  summarise(sumB = sum(B),
            maxC = max(C)) %>% 
  mutate(equal = case_when(sumB== maxC ~ "yes"))
  group  sumB  maxC equal
  <dbl> <dbl> <dbl> <chr>
1     1    1     2  NA   
2     2  127.  127. yes  
3     3    1     1  yes

现在稍大一些的数字:74.2 + 153.2 = 227.4

df<-tibble(group=c(1,2,2,3),
           B=c(1.0,74.2,153.2,1.0),
           C=c(2,227.4,227.4,1.0))

df %>% 
  group_by(group) %>% 
  summarise(sumB = sum(B),
            maxC = max(C)) %>% 
  mutate(equal = case_when(sumB== maxC ~ "yes"))
# A tibble: 3 x 4
  group  sumB  maxC equal
  <dbl> <dbl> <dbl> <chr>
1     1    1     2  NA   
2     2  227.  227. NA   
3     3    1     1  yes

直接数学

74.2+153.2==227.4
[1] FALSE

现在用isTRUE()all.equal()包裹

isTRUE(all.equal(74.2+153.2, 227.4))
  

[1]是

现在修改后的case_when()

df %>% 
  group_by(group) %>% 
  summarise(sumB = sum(B),
            maxC = max(C)) %>% 
  mutate(equal = case_when(isTRUE(all.equal(sumB, maxC)) ~ "yes"))
# A tibble: 3 x 4
  group  sumB  maxC equal
  <dbl> <dbl> <dbl> <chr>
1     1    1     2  NA   
2     2  227.  227. NA   
3     3    1     1  NA

否,这不是预期的结果。解决这个问题的正确方法是什么?

0 个答案:

没有答案