无法删除无关的浮点值

时间:2019-04-24 05:24:19

标签: r

  

数据集Full sample can be download via this link的样本

Date/Time,Hs,Hmax,Tp,Tz,Peak Direction,SST
1/01/2018 0:00,-99.9,-99.9,-99.9,-99.9,-99.9,-99.9
1/01/2018 0:30,0.513,0.81,10.315,4.748,-99.9,-99.9
1/01/2018 1:00,0.566,0.93,10.778,5.003,92,26.4
1/01/2018 1:30,0.557,0.85,9.984,4.99,91,26.4
  

通过此方法读取,除date.time外的所有列均为数字。

maloolaba.waves <- read.csv(file = "./data/mooloolaba_2018-01-01t00_00-2018-10-31t23_30.csv", header = T)
  

用于删除包含-99.9的行的功能。

maloo.RM.outlier <- maloolaba.waves[!(apply(maloolaba.waves, 1, 
                             function(y) any(y == -99.9) )),]
  

现在,当我在删除值-99.9后执行摘要时,我得到了。

summary(maloo.RM.outlier)

          Date.Time           Hs               Hmax        
 1/01/2018 1:00 :    1   Min.   :-99.900   Min.   :-99.900  
 1/01/2018 1:30 :    1   1st Qu.:  0.805   1st Qu.:  1.350  
 1/01/2018 10:00:    1   Median :  1.112   Median :  1.870  
 1/01/2018 10:30:    1   Mean   :  1.234   Mean   :  2.089  
 1/01/2018 11:00:    1   3rd Qu.:  1.608   3rd Qu.:  2.700  
 1/01/2018 11:30:    1   Max.   :  4.257   Max.   :  7.262  
 (Other)        :14543                                      
       Tp                Tz          Peak.Direction      SST       
 Min.   :-99.900   Min.   :-99.900   Min.   :  5    Min.   :19.80  
 1st Qu.:  7.529   1st Qu.:  5.035   1st Qu.: 91    1st Qu.:21.00  
 Median :  9.146   Median :  5.568   Median :105    Median :23.00  
 Mean   :  9.245   Mean   :  5.679   Mean   :103    Mean   :23.43  
 3rd Qu.: 10.903   3rd Qu.:  6.257   3rd Qu.:119    3rd Qu.:26.00  
 Max.   : 21.121   Max.   : 10.146   Max.   :358    Max.   :28.65 

但是,当我查看maloo.RM.outlier的数据集时,没有值-99.9,因此我进行了搜索。

which(maloo.RM.outlier$Hs == -99.9, arr.ind = T)

[1] 11501 13775

我尝试查看编号为11501和13775的行,那里没有-99.9值。我已经尝试过,清除全局环境数据,重新启动R会话,似乎没有什么可以完全消除值-99.9,并且摘要仍显示最小值= -99.9。有谁知道如何删除浮点值?

1 个答案:

答案 0 :(得分:2)

由于R's FAQ 7.31,您不能真正测试浮点相等性,仅是一个近似值。有几种方法可以做到,但是一种流行的(也是我最喜欢的)方法是减去我的极限/等式并寻找低于阈值的东西。

由于实际值可能在我的比较值的任一侧(正/负),因此我们可以使用绝对值将其考虑在内。结果代码会更改您的

any(y == -99.9)

any( abs(y + 99.9) < 1e-9 )

巧合的是,正是Marius建议的功能(dplyr::near)正在做的事情:

dplyr::near
# function (x, y, tol = .Machine$double.eps^0.5) 
# {
#     abs(x - y) < tol
# }
# <bytecode: 0x000000002506d7b8>
# <environment: namespace:dplyr>

尽管它正在使用一种更为健壮的方法,通过使用.Machine$double.eps^0.5来找到刚好在“接近零”以上的值。

我为代码高尔夫球选择了1e-9,尽管如果您正在编写某些程序,则可能应该将其命名为有意义的名称,因此它不是“魔术常数”。可能是tol <- 1e-9eps <- 1e-9(对于 epsilon ,这是一个经常用于表示任意小的正数的变量)。