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'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-9
或eps <- 1e-9
(对于epsilon,一个常用于表示任意小的正数的变量)。