Проблема при импорте числа с плавающей запятой в виде строки из Excel. Неправильное добавление точности

Использование openxlsx read.xlsx для импорта фрейма данных из мультиклассового столбца. Желаемый результат - импортировать все значения в виде строк, точно так, как они представлены в Excel. Однако некоторые десятичные дроби представлены как очень длинные числа с плавающей запятой.

Образцы данных - это просто файл Excel со столбцом, содержащим следующие строки:

abc123, 
556.1, 
556.12, 
556.123, 
556.1234, 
556.12345 

require(openxlsx)
df <- read.xlsx('testnumbers.xlsx', )   

Использование приведенного выше кода R для чтения файла приводит к df, содержащему эту строку

values:
abc123, 
556.1, 
556.12,
556.12300000000005, 
556.12339999999995, 
556.12345000000005

В производственном файле Excel столбец отформатирован как «Общие». Если я отформатирую столбец как текст, изменений не произойдет, если я явно дважды не щелкну каждую ячейку в Excel и не нажму Enter. В этом случае номер правильно отображается в виде строки. К сожалению, щелкать каждую ячейку нельзя в производственной среде. Приветствуются любые решения, Excel, R или другие.

* Изменить: я прочитал этот вопрос и считаю, что понимаю математику того, что происходит. На данный момент, я полагаю, я ищу обходной путь. Как я могу получить число с плавающей запятой из Excel в фрейм данных R в виде текста без изменения представления?

Почему числа с плавающей запятой неточны?


person Jason Green    schedule 25.06.2018    source источник
comment
Попробуйте другой пакет, например readxl, в котором есть функция read_excel, которая может использовать col_types="text" для чтения всех столбцов как строк.   -  person MrFlick    schedule 25.06.2018
comment
Спасибо за предложение. Я просто попробовал это, и возникла та же проблема.   -  person Jason Green    schedule 25.06.2018


Ответы (2)


Мне удалось получить правильные форматы во фрейме данных, используя pandas в python.

import pandas as pd
test = pd.read_excel('testnumbers.xlsx', dtype = str)

Этого будет достаточно в качестве обходного пути, но я бы хотел увидеть решение, построенное на R.

person Jason Green    schedule 27.06.2018

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

Я буду использовать его для переформатирования определенных ячеек в большом количестве файлов (в моем случае я конвертирую из общего в «научный» - как пример того, как вы можете изменить это для другого формата). При этом используются функции из пакета openxlsx, на который вы ссылаетесь в OP

Сначала загрузите файл xlsx как книгу (хранящуюся в памяти, которая сохраняет все форматирование xlsx и т. д.; немного отличается от метода, показанного в вопросе, который извлекает только данные):

testnumbers <- loadWorkbook(here::here("test_data/testnumbers.xlsx"))

Затем создайте «стиль» для применения, который преобразует числа в «текст» и применит его к виртуальному рабочему листу (в памяти).

numbersAsText <- createStyle(numFmt = "TEXT")
addStyle(testnumbers, sheet = "Sheet1", style = numbersAsText, cols = 1, rows = 1:10)

наконец, сохраните его обратно в исходный файл:

saveWorkbook(testnumbers, 
               file = here::here("test_data/testnumbers_formatted.xlsx"),
               overwrite = T)

Когда вы откроете файл Excel, числа будут сохранены как «текст».

person Matt L.    schedule 08.08.2018
comment
Это похоже на верный путь, но у меня есть несколько проблем. here :: here выдает ошибки, говоря, что это не пакет. Удаление этого текста, похоже, помогло загрузить книгу в память. Мне интересно работать с данными внутри R как с текстом. Не просто записать его обратно в Excel в виде текста. Как мне поместить этот объект книги в фрейм данных? - person Jason Green; 19.09.2018
comment
вместо here::here() можно использовать filepath(). извините, я использую слишком много ярлыков пакетов. - person Matt L.; 19.09.2018
comment
и я только что узнал об этом, но вы можете: read.xlsx(testnumbers). он просто будет считывать данные из памяти так же, как из файла xlsx - person Matt L.; 19.09.2018