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。有谁知道如何删除浮点值?
答案 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-9
或eps <- 1e-9
(对于 epsilon ,这是一个经常用于表示任意小的正数的变量)。