从Excel导入float作为字符串时出现问题。错误地添加精度

时间:2018-06-25 14:33:04

标签: r excel openxlsx

使用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数据框?

Why Are Floating Point Numbers Inaccurate?

2 个答案:

答案 0 :(得分:1)

我能够使用python中的pandas将正确的格式转换为数据框。

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

这可以作为解决方法,但我希望看到一个内置于R中的解决方案。

答案 1 :(得分:0)

这是R中使用openxlsx的一种变通方法,我曾经用来解决类似的问题。我认为它将解决您的问题,或者至少允许您以编程方式将其设置为excel文件中的文本格式。

我将使用它来重新格式化大量文件中的特定单元格(在我的情况下,我正在将其从普通格式转换为“科学格式”,以示例说明如何将其更改为另一种格式)。 这会使用您在OP中引用的openxlsx包中的功能

首先,将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文件时,数字将存储为“文本”