当一个单元格不是数字时,R 包 XLSX 将整列转换为字符串或布尔值

Posted

技术标签:

【中文标题】当一个单元格不是数字时,R 包 XLSX 将整列转换为字符串或布尔值【英文标题】:The R package XLSX is converting entire column to string or boolean when one cell is not numeric 【发布时间】:2018-04-01 02:47:15 【问题描述】:

我正在使用 R 下的 Shiney 界面来读取 CSV 文件并将其加载到一张 excel xlsm 文件中。然后,该文件允许用户输入并根据 VBA 宏执行计算。

R xlsx 包在保留原始 excel 表中的 VBA 和格式方面效果很好。但是,某些数据正在转换为与预期不同的数据类型。例如,包含字符串“F”的单元格导致包含它的列被转换为布尔类型,或者一个单元格中未输入的数字导致整个列被转换为字符串。

是否可以控制这种行为,例如,不将具有有效数字的单元格转换为字符串类型?有解决办法吗?或者有人可以帮助我了解包装内部发生了什么导致这种效果,以便我可以尝试找到解决方法吗?

以下是有问题的调用:

#excelType() points to an excel xlsm template

data = read.csv("results.csv")
excelForm = loadWorkbook(excelType())
sheets = getSheets(excelForm)
addDataFrame(data, sheets[[1]], col.names = FALSE, row.names = FALSE, startRow=2, colStyle = NULL)
saveWorkbook(excelForm, "results.xlsm")

谢谢!

【问题讨论】:

不是你想要的答案,而是那个包has not been updated in over three years。根据您的需要,我推荐openxlsxreadxl 很遗憾没有:如果列中有字符串,xlsx 包(或任何 R 包)会将列转换为字符串类型。您需要在导入后对其进行清理。请参阅有关将杂乱数据从 Excel 导入 R 的一般问题:***.com/questions/43242467/… 在这种情况下,F 被解释为不是字符串,而是FALSE 的 R 标准快捷方式(您可能知道)。通常,阅读函数允许您手动定义列类,因此如果您提前知道,也许您可​​以这样做。 我一直使用这个功能,但是昨天,我第一次遇到了同样的问题...一列有 9 行(例如 1,2,3,4,5,6, 7,8,9),在一行中仅转换为一个字符串“c(1,2,3,4,5,6,7,8,9)”...无法解决...我只是保存为 RData 来解决后者 【参考方案1】:

我希望这是解释对我有用的结果的正确协议。我希望如果他们最终做类似的事情对其他人有所帮助,尽管解决方案不是很优雅!

我尝试了 r2evans 的强制列类型的建议,但在这种情况下我无法让它工作。使用 readxls 给出了同样的问题,并且还破坏了我的 VBA。鉴于 lebelionz 的评论表明这是 R 事物而不是包装事物,我按照他的建议在事后处理它。 (我不知道如何评价评论而不是答案,但为了记录,这非常有帮助,其他人也是如此)。

因此,我更改了生成通过 R 加载的 CSV 的程序。我将“::”附加到生成的每个单元格中,以便 R 将所有单元格视为字符串,而不管原始内容如何。因此,“F”被存储为“::F”,因此不会被 R 更改。

我在这样创建的 Excel 表中添加了一个自动运行宏,以便在打开它时自动执行全局搜索和替换以从整个数据中删除前缀“::”。这会强制 Excel 在还原后为每个单元格选择一种数据类型,从而逐个单元格地检测到这些类型,并以适合我的目的使用正确的格式。

感觉很笨拙,但它可以工作并且对用户来说相对透明。一个危险是,如果用户数据故意包含字符串“::”,它将丢失(我相信这不会在我的特定应用程序中出现,但如果有人想建议一个更好的前缀,我会感兴趣)。我仍然希望找到最终的解决方案,而不是变通方法。

在这里,我认为只有电影业必须“在后期修复它”!

【讨论】:

以上是关于当一个单元格不是数字时,R 包 XLSX 将整列转换为字符串或布尔值的主要内容,如果未能解决你的问题,请参考以下文章

PL/R - 将整列作为参数传递

在EXCEL中如何让一列数字变成文本格式?就是想让单元格的左上角变一个绿绿的?

将整列整数转换为字符串,在 Pandas 中使用逗号分隔千位

在 R 中的 pheatmap 单元格中显示原始数字

Excel表格中在一个文本单元格前边加几个字母应该怎么做?

EXCEL里出现 #REF! 和#VALUE! 是啥意思?