1

使用 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 数据框作为文本?

为什么浮点数不准确?

4

2 回答 2

1

我能够在 python 中使用 pandas 将正确的格式放入数据框中。

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

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

于 2018-06-27T13:25:03.847 回答
0

openxlsx这是我用来解决类似问题的 R 中的一种解决方法。我认为它会解决您的问题,或者至少允许您以编程方式在 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 文件时,数字将存储为“文本”

于 2018-08-08T18:11:37.113 回答