将带有单元格公式的Excel文件读入R语言

5
我正在尝试将Excel电子表格读入R数据框。然而,一些列具有公式或链接到其他外部电子表格。每当我将电子表格读入R时,总会有许多单元格变为NA。有没有好的方法来解决这个问题,以便我可以获得这些单元格的原始值?

我用于导入的R脚本如下:
options(java.parameters = "-Xmx8g")
library(XLConnect)
# Step 1 import the "raw" tab
path_cost = "..."
wb = loadWorkbook(...)
raw = readWorksheet(wb, sheet = '...', header = TRUE, useCachedValues = FALSE)

不一定是你想要的,但你可以在Excel中使用复制,然后粘贴为值。 - mattdevlin
“问题”?这取决于你想要实现什么,而从我的角度来看并不清楚。 - SabDeM
@SabDeM 我想使用那些单元格中的值,这些值在原始的Excel文件中是可用的,但现在变成了NA(不可用)。 - xyin
@xyin 好的,请更新您的问题并提供这些细节,以便用户更好地帮助您。下次请尽量提前提供所有细节,不要等待用户询问。 - SabDeM
openxlsx非常快,如果您正在使用Windows,请尝试使用它。 https://dev59.com/c6bja4cB1Zd3GeqPczVY#51376514 - makarand kulkarni
1个回答

11

更新:来自readxl包的read_excel看起来是一个更好的解决方案。它非常快(在我在评论中提到的1400 x 6文件中只需要0.14秒),并且在导入之前会计算公式。它不使用Java,因此无需设置任何Java选项。

 # sheet can be a string (name of sheet) or integer (position of sheet)
 raw = read_excel(file, sheet=sheet)

更多信息和示例请参见简短的vignette

原始回答:尝试使用xlsx包中的read.xlsx函数。帮助文件暗示默认情况下在导入之前计算公式(请参阅keepFormulas参数)。我在一个小测试文件上进行了测试,效果不错。公式结果被正确地导入,包括依赖于同一工作簿中其他表格和依赖于同一目录中其他工作簿的公式。

一个警告:如果外部链接的表格自上次更新到您读入R的文件时发生了更改,则任何依赖于外部链接的值都将是旧值,而不是最新值。

对于你的代码,应该是这样的:

library(xlsx)

options(java.parameters = "-Xmx8g") # xlsx also uses java

# Replace file and sheetName with appropriate values for your file
# keepFormulas=FALSE and header=TRUE are the defaults. I added them only for illustration.
raw = read.xlsx(file, sheetName=sheetName, header=TRUE, keepFormulas=FALSE)

我按照你的代码尝试使用read.xlsx,但速度非常慢,近10分钟后代码仍在运行。电子表格中有12378行,这会是一个问题吗? - xyin
我很惊讶这么大的表格读取速度那么慢(你有很多列吗)。尝试使用read.xlsx2。它比read.xlsx更快。请查看read.xlsx帮助以了解read.xlsxread.xlsx2之间的区别。 - eipi10
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - eipi10
更正:read.xlsx2 对于带有公式的单元格会返回 NA,因此无法使用。您需要继续使用 read.xlsx - eipi10
我尝试了read_excel(),它确实比gdata的read.xls()更快。非常感谢您的帮助! - xyin
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接