Исправление "резюме" в R с соответствующим количеством цифр точности

A простой вопрос о простой невидимой функции : summary.

До тех пор, пока я не увидел результаты для Min и Max, которые были вне диапазона моих данных, я не знал, что summary имеет аргумент digits для определения точности результатов вывода. Мой вопрос в том, как решить эту проблему чистым, универсальным образом.

Вот пример проблемы:

set.seed(0)
vals    <- 1 + 10 * 1:50000
df      <- cbind(rnorm(10000),sample(vals, 10000), runif(10000))

Применяя summary и range, мы получаем следующий результат: обратите внимание на несоответствие значений диапазона по сравнению с Min и Max:

    > apply(df, 2, summary)

                [,1]   [,2]      [,3]
    Min.    -3.703000     11 6.791e-05
    1st Qu. -0.668500 122800 2.498e-01
    Median   0.009778 248000 5.014e-01
    Mean     0.010450 248800 5.001e-01
    3rd Qu.  0.688800 374000 7.502e-01
    Max.     3.568000 499900 9.999e-01

    >     apply(df, 2, range)
            [,1]   [,2]         [,3]
    [1,] -3.703236     11 6.790622e-05
    [2,]  3.568101 499931 9.998686e-01

Видя ошибочные диапазоны в summary, немного обескураживает, поэтому я посмотрел опцию digits, но это просто стандартная нотация для форматирования вывода. Также обратите внимание: каждый отдельный квантиль, отличный от Min, показывает значение, которое не существует в наборе данных (вот почему я положил 1 + в определение для vals), и никто не увидит эти квантили в большинстве стандартных квантильных вычислений, даже учитывая различия в выборе средней точки. (Когда я увидел это в исходных данных, я подумал, как я потерял значение 1 из всего!)

Существует различие между объясняемым вычислительным поведением (то есть форматированием и точностью) и статистически мотивированными исходами (такие значения определяются как квантили, фактически находящиеся в пределах набора данных). Поскольку мы не можем изменить ожидания, нам нужно изменить поведение кода или, по крайней мере, улучшить его.

Вопрос: есть ли еще более подходящий способ установки вывода для определения диапазона, отличного от установки его на большое значение, например. digits = 16? Является ли 16 наиболее подходящим универсальным дефолтом? Использование 16 цифр, по-видимому, является лучшей гарантией точности для двойных поплавков, хотя кажется, что на выходе не будет на самом деле 16 цифр (выход по-прежнему кажется усеченным до 8 или 9 цифр).


Обновление 1: Как заметил @BrianDiggs, через ссылки поведение документировано, но неожиданно. Чтобы прояснить мою проблему, относительно ответов на ссылку, предоставленную Брайаном (кроме ответа самого Брайана): это не то, что поведение недокументировано, но оно абсолютно неверно обозначать как значения Min и Max, которые не являются Min и Max. Документированная функция, которая дает неправильный вывод в настройках по умолчанию, должна использоваться с настройками, отличными от параметров по умолчанию (или их не следует использовать). (Может быть, можно утверждать, следует ли "Мин" и "Макс" переименовать в "Приблизительные минуты" и "Приблизительный Макс", но не отпускайте их там.)

Обновление 2: Как отметил @Dwin, summary() принимает по умолчанию max(3, getOption("digits") - 3). Я ранее ошибался, говоря, что по умолчанию было 3. Интересно, что это означает два пути, чтобы установить поведение вывода. Если мы используем оба варианта, поведение становится странным:

> options(digits = 20)
> apply(df, 2, summary, digits = 10)

                             [,1]                  [,2]                      [,3]
Min.    -3.7032358429999998605808     11.00000000000000 6.7906221370000004927e-05
1st Qu. -0.6684710537000000396546 122798.50000000000000 2.4977348059999998631e-01
Median   0.0097783099960000001427 247971.00000000000000 5.0137970539999998643e-01
Mean     0.0104475229200000005458 248776.38699999998789 5.0011818200000002221e-01
3rd Qu.  0.6887842181000000119084 374031.00000000000000 7.5024240300000000214e-01
Max.     3.5681007909999999938577 499931.00000000000000 9.9986864070000003313e-01

Обратите внимание, что это теперь имеет 20 цифр вывода, хотя переданный аргумент указывает 10 цифр точности. Если мы установим глобальную опцию для цифр как "разумное" значение, такое как 16, мы все равно закончим проблемы, если мы предоставим summary аргумент из 10.

Я считаю, что документация неполна, и Брайан Диггс указал на другие проблемы с ним в своем вдумчивом ответе в ссылке на R-help.

Несмотря на эти морщины, вопрос остается открытым, но, возможно, на него нельзя ответить. Я подозреваю, что лучший результат - просто оставить параметр глобальных цифр как есть (хотя меня немного беспокоят последствия вышеупомянутого поведения) и вместо этого передайте значение от 16 до summary. Не сразу видно, где задана выходная точность, но это взаимодействие 4 значений - глобальная опция (и глобальная опция - 3), пройденное значение и жестко закодированное значение 12 в summary.data.frame выглядит так: (дайте мне понять мою душу), взломать.

Обновление 3: Я принимаю ответ DWin - это привело ко мне понимание того, как эта колбаса сделана. Видя, что происходит, я не думаю, что есть способ сделать то, что я прошу, не переписывая summary.

Ответ 1

По умолчанию для summary.data.frame нет цифр = 3, а скорее:

   ... max(3, getOption("digits") - 3)  # set in the argument list
getOption("digits")    # the default setting
[1] 7
options(digits=10)
> summary(df)
       V1                    V2                 V3              
 Min.   :-3.70323584   Min.   :    11.0   Min.   :6.790622e-05  
 1st Qu.:-0.66847105   1st Qu.:122798.5   1st Qu.:2.497735e-01  
 Median : 0.00977831   Median :247971.0   Median :5.013797e-01  
 Mean   : 0.01044752   Mean   :248776.4   Mean   :5.001182e-01  
 3rd Qu.: 0.68878422   3rd Qu.:374031.0   3rd Qu.:7.502424e-01  
 Max.   : 3.56810079   Max.   :499931.0   Max.   :9.998686e-01