将表格从 R 获取到 Libre Office Writer 的最佳方法?
Posted
技术标签:
【中文标题】将表格从 R 获取到 Libre Office Writer 的最佳方法?【英文标题】:Best ways of getting tables from R into Libre Office Writer? 【发布时间】:2015-06-13 03:04:29 【问题描述】:目前,我的工作流程是在 R 中进行统计和数据重组,并使用 Libre Office (LO) Writer 编写文档。 R 中的分析结果通常是表格,我需要将它们放入 LO Writer。我还没有找到直接以简单的方式执行此操作的方法,所以我通常做的是:1)将表格放在 R 中,2)将表格导出为 .csv,3)在 LO Calc 中打开 .csv,4)使用特殊粘贴作为 RTF 从 LO Calc 复制到 LO writer。
保存到 .csv 时,我使用 write.csv(table_1, "table_1.csv", na = "")
来执行此操作。这导致了一个额外的步骤,因为 LO Calc 需要知道如何读取 .csv 文件。或者,可以install one of the packages 输出到 .ods 或 .xls(x)。
这样做的一个问题是,这经常会导致文件中的十进制数字很长,例如2.21931,而通常只想在文档中显示 2 或 3 位数字。对于这种烦恼,我找到了两种解决方案。
第一个是使用例如对 R 中的数字进行四舍五入。 round(table_1, 2)
然后使用上述命令保存。这样做的问题是,当将其导入 LO Calc 时,0.60 之类的数字将变为 0.6,失去一个(冗余)数字。这使得呈现有些不一致。可以将它们添加回文档中的表格中或使用 LO Calc 中的舍入函数。
第二种是使用Libre Office Calc中的舍入功能,但这需要一些额外的工作/更多工作。
最后,当重要的表格像这样进入 LO Writer 时,表格会有不可见的边框。必须为每个表手动添加这些。
在避免有效数字问题和额外点击的同时,将结果表从 R 获取到 LO Writer 的最佳方法是什么?
【问题讨论】:
也许是一些快捷方式:我使用(在 Windows 上)write.table(dat, 'clipboard', sep='\t', row.names=FALSE, header=TRUE)
并将其粘贴到我的电子表格中。这避免了保存和导入 CSV 的需要。至于有效数字,您是否尝试过dat[,num_columns] <- sapply(dat[,num_columns], format, digits=3)
之类的东西?
使用剪贴板不是一个坏主意。我已经尝试过format()
,但由于某种原因它将类型更改为字符。但是,我没有在sapply()
中尝试过。
如果不转换为字符串,则无法确保在舍入后显示有效数字。否则,您需要依靠 Calc 和/或 Writer 来处理有效数字。
更重要的是:在电子表格中,您通常可以控制每个单元格的符号位数,但只会影响数字的显示方式,无论是浮点数还是整数。在 R 中,您通常只能在全局级别上控制有效数字(除了一些小例外),这同样不会影响数据结构内部数字的精度;它只是一个显示配置。通常 CSV 和复制/粘贴元数据不包括特定于显示的参数。因此,如果您想在复制/粘贴中强制执行此操作,则必须通过字符串。
我同意@AaronKatch,sprintf
是一个很好的字符串格式化工具,尽管这可能是我的 C/C++ 培训开始的原因。我经常不在建议中首先列出它,因为我的看法是format
和paste
是许多R 程序员的首选(我不认为这是基于性能的偏好)。
【参考方案1】:
尝试使用sprintf()
等函数在R
中进行格式化。
这是我发现控制数字显示的最佳方式。
下面的 url 有很好的工作示例。
http://www.cookbook-r.com/Strings/Creating_strings_from_variables/
另外,考虑使用knitr
包来动态创建文档。
【讨论】:
【参考方案2】:如果您想要一种完全自动化的方式来生成 LibreOffice 文档,标准的 R 做事方式是使用 knitr
编写文档,然后使用 Pandoc 将生成的文件转换为 ODT 格式。
(Pandoc 还不支持 AsciiDoc 作为输入格式,因此您只能在 markdown/LaTeX/html/textile/reStructuredText 中编写文档。)
【讨论】:
以上是关于将表格从 R 获取到 Libre Office Writer 的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章
Libre Office 电子表格 - 如何在列中的多个重复值中仅保留一个值?