Невозможно удалить нерелевантное значение с плавающей точкой - PullRequest
0 голосов
/ 24 апреля 2019

Образец набора данных Полный образец можно скачать по этой ссылке

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 Ответ

2 голосов
/ 24 апреля 2019

Из-за R часто задаваемых вопросов 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 для code-golf, хотя, если вы что-то программируете, вам, вероятно, следует назвать это чем-то значимым, чтобы это не было «магической константой». Возможно tol <- 1e-9 или eps <- 1e-9 (для epsilon , переменная, часто используемая для обозначения сколь угодно малого положительного числа).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...