Суммарная функция Ошибка округления в r?

У меня есть кадр данных из 16968 строк (причины точности будут разъяснены ниже). Я проверяю, действительно ли текущая переменная (data$Ob) считает каждую строку в последовательном порядке (данные $Ob первой строки равны 1... данные последней строки $Ob равны 16968 и для каждой строки между ними.

Когда я запускаю сводку (данные $ Ob), он говорит мне, что максимум составляет 16970, а не 16968. Когда я запускаю max (data $ Ob), он говорит, что максимум составляет 16968, а не значение из сводки.

Я запустил цикл for, чтобы проверить каждое наблюдение, и похоже, что функция max() правильная и что переменная data$Ob делает то, что должна. Но кто-нибудь знает, почему функция суммирования отключена на 2? Я предполагаю ошибку округления (каким-то образом?), но эта проверка данных имеет решающее значение для анализа, который я делаю, и если она неверна, то мой последующий анализ будет чушью.

Вот цикл for, который я запустил, но я не думаю, что это имеет решающее значение для этого вопроса.

checker <- vector(length=nrow(rd))
na.checker <- vector(length=nrow(rd))
    for (i in 1:nrow(rd)){
        checker[i] <- ifelse(i==rd$Ob[i], 1, 0)
        na.checker[i] <- ifelse(is.na(rd$Ob[i])==TRUE,0,1)
}
sum(checker)

Спасибо.


person BGTP33    schedule 04.05.2013    source источник


Ответы (1)


Без воспроизводимого примера трудно сказать, но он пахнет как мать всех часто задаваемых вопросов: точность отображения по умолчанию составляет четыре цифры, поэтому 16968 округляется до 16970.

Редактировать: нам нужны ваши образцы данных, потому что на наивном примере я не могу воспроизвести это:

R> set.seed(42) 
R> df <- data.frame(a=as.numeric(1:16968), b=16968:1, 
+                   c=rnorm(16968), d=runif(16968))
R> summary(df)
       a               b               c                  d           
 Min.   :    1   Min.   :    1   Min.   :-4.04328   Min.   :0.000101  
 1st Qu.: 4243   1st Qu.: 4243   1st Qu.:-0.68271   1st Qu.:0.252515  
 Median : 8484   Median : 8484   Median :-0.00528   Median :0.505090  
 Mean   : 8484   Mean   : 8484   Mean   :-0.00834   Mean   :0.504563  
 3rd Qu.:12726   3rd Qu.:12726   3rd Qu.: 0.66746   3rd Qu.:0.758991  
 Max.   :16968   Max.   :16968   Max.   : 4.32809   Max.   :0.999976  

Редактировать 2 с h/t на @SimonO101:

R> summary(df$a)                                   ## what OP saw
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      1    4240    8480    8480   12700   17000 
R> summary(df$a, digits=6)                         ## what OP wanted to see
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      1    4243    8484    8484   12726   16968 
R> 
person Dirk Eddelbuettel    schedule 04.05.2013
comment
+1 Никогда этого не знал. Кажется странным поведением по умолчанию для сводки целочисленного вектора. - person Simon O'Hanlon; 05.05.2013
comment
Бинго -- спасибо, Саймон. Я знал, что сам видел это миллион раз, но это действительно вызывается только сводками по столбцам. Буду редактировать снова. - person Dirk Eddelbuettel; 05.05.2013