无法删除不相关的浮点值

问题描述 投票:0回答:1

数据集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。有谁知道如何删除浮点值?

r
1个回答
2
投票

因为R's FAQ 7.31,你无法真正测试浮点相等,只是一个近似值。有几种方法可以做到这一点,但一种流行的(和我最喜欢的)方法是减去我的限制/相等并寻找低于阈值的东西。

因为实际值可能在我的比较值的任一侧(pos / neg),我们可以使用绝对值来考虑它。生成的代码会改变您的

any(y == -99.9)

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

巧合的是,正是马吕斯建议的功能(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,一个常用于表示任意小的正数的变量)。

© www.soinside.com 2019 - 2024. All rights reserved.