R добавляет дополнительные числа при чтении файла - PullRequest
0 голосов
/ 04 сентября 2018

Я пытался прочитать файл с полем даты и числовым полем. У меня есть данные в листе Excel и выглядит примерно так -

Date          X       
1/25/2008     0.0023456
12/23/2008    0.001987

Когда я читаю это в R с помощью функции readxl :: read_xlsx , данные в R выглядят следующим образом -

Date          X
1/25/2008     0.0023456000000000
12/23/2009    0.0019870000000000

Я пытался ограничить цифры, используя такие функции, как round, format (nsmall = 7) и т. Д., Но, похоже, ничего не работает. Что я делаю неправильно? Я также попытался сохранить данные в формате csv и txt и прочитать их, используя read.csv и read.delim, но я снова столкнулся с той же проблемой. Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Возможно, проблема не в вашем исходном файле, поскольку вы говорите, что это также происходит с .csv и .txt.

Попробуйте проверить текущее значение параметра отображаемых цифр, набрав options()$digits

Если результат, например, 14 тогда это, вероятно, проблема.

В этом случае попробуйте выполнить команду r options(digits=8), которая установит цифры дисплея = 8 для сеанса.

Затем просто перепечатайте ваш фрейм данных, чтобы увидеть, что изменение уже вступило в силу в отношении того, как десятичные дроби отображаются по умолчанию на экране.

Обратитесь к ?options за дополнительной информацией о настройке отображения цифр и других параметрах сеанса.

Изменить, чтобы улучшить оригинальный ответ и уточнить для будущих читателей:

  1. Изменение options(digits=x) вверх или вниз приводит к не изменению значения, которое сохраняется или считывается во внутреннюю память для переменных с плавающей запятой. Параметр сеанса digits просто меняет способ отображения значений с плавающей запятой print , т. Е. Отображает на экране общие функции печати в соответствии с документацией «options»:

цифр: управляет количеством значащих цифр для печати при печати числовых значений.

  1. То, что ОП показало как проблему, с которой он столкнулся (R отображал больше десятичных знаков после последней цифры в десятичном числе, чем ожидалось увидеть ОП), не было вызвано тем, что исходный файл был прочитан из Excel - т.е. учитывая, что ОП имел та же проблема с CSV и TXT, процесс импорта не вызвал проблемы.

Если в распечатанном / отображаемом выводе вы видите больше десятичных чисел, чем вы хотите по умолчанию (например, для кадров данных и числовых переменных), попробуйте проверить options()$digits и понять, что эта опция является просто значением по умолчанию для числа цифр, используемого в общем числе R методы отображения и печати. ОДНАКО, это не влияет на хранение с плавающей запятой ни на каких ваших данных или переменных.

Что касается чисел с плавающей запятой, другой ответ здесь показывает, как установка option(digits=n) выше значения по умолчанию может помочь продемонстрировать некоторые особенности точности / отображения, связанные с точностью с плавающей запятой. Это отдельная проблема для того, что ОП показало в его примере, но это стоит понять.

Для более подробного и тематического обсуждения точности с плавающей запятой, чем было бы уместно перефразировать здесь, стоит прочитать этот окончательный вопрос SO + ответ: Почему эти числа не равны?
Этот другой вопрос + ответ + обсуждение посвящен вопросам, касающимся точности с плавающей запятой, и содержит длинный, хорошо представленный список ссылок, которые вы найдете полезными, если вам нужна дополнительная информация по этому вопросу.

0 голосов
/ 04 сентября 2018

Как отмечено в комментариях к OP и другому ответу, эта проблема связана с тем, как математика с плавающей запятой обрабатывается на процессоре, используемом для запуска R, и его взаимодействием с опцией digits.

Для иллюстрации мы создадим электронную таблицу Excel с данными из OP и продемонстрируем, что происходит, когда мы настраиваем параметр options(digits=).

enter image description here

Далее мы напишем короткий скрипт R, чтобы проиллюстрировать, что происходит, когда мы настраиваем опцию digits.

> # first, display the number of significant digits set in R
> getOption("digits")
[1] 7
> 
> # Next, read data file from Excel
> library(xlsx)
> 
> theData <- read.xlsx("./data/smallNumbers.xlsx",1,header=TRUE)
> 
> head(theData)
        Date         X
1 2008-01-25 0.0023456
2 2008-12-23 0.0019870
> 
> # change digits to larger number to replicate SO question
> options(digits=17)
> getOption("digits")
[1] 17
> head(theData)
        Date                     X
1 2008-01-25 0.0023456000000000002
2 2008-12-23 0.0019870000000000001
>

Однако поведение печати значащих цифр зависит от процессора / операционной системы, так как установка options(digits=16) приводит к следующему на машине с процессором Intel i7-6500U с Microsoft Windows 10:

> # what happens when we set digits = 16?
> options(digits=16)
> getOption("digits")
[1] 16
> head(theData)
        Date         X
1 2008-01-25 0.0023456
2 2008-12-23 0.0019870
> 
0 голосов
/ 04 сентября 2018
library(formattable)

x <- formattable(x, digits = 7, format = "f")

или вы можете добавить это, чтобы получить форматирование по умолчанию из R:

options(defaultPackages = "")

затем перезагрузите свой R.

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