Прочитать файл excel с формулами в ячейках в R

Я пытался прочитать электронную таблицу 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)

person xyin    schedule 14.08.2015    source источник
comment
Не обязательно то, что вы хотите, но вы можете в Excel использовать копирование, а затем вставку в качестве значений.   -  person mattdevlin    schedule 14.08.2015
comment
Проблема, говорите? это зависит от того, чего вы пытаетесь достичь, что с моей точки зрения непонятно.   -  person SabDeM    schedule 14.08.2015
comment
@SabDeM Я хочу использовать значения в тех ячейках, значения которых доступны в исходном файле Excel, но теперь становятся NA (недоступно)   -  person xyin    schedule 14.08.2015
comment
@xyin хорошо, пожалуйста, обновите свой вопрос, указав эти данные, чтобы пользователь мог лучше помочь вам, и в следующий раз постарайтесь предоставить все подробности заранее и не ждите, пока пользователь их попросит.   -  person SabDeM    schedule 14.08.2015
comment
openexls очень быстро, попробуйте это, если вы используете окна stackoverflow.com/questions/46914303/   -  person makarand kulkarni    schedule 17.07.2018


Ответы (1)


ОБНОВЛЕНИЕ: read_excel из пакета readxl выглядит лучшим решением. Это очень быстро (0,14 секунды в файле 1400 x 6, о котором я упоминал в комментариях) и оценивает формулы перед импортом. Он не использует Java, поэтому не нужно устанавливать какие-либо параметры Java.

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

Для получения дополнительной информации и примеров см. короткую виньетку.

ИСХОДНЫЙ ОТВЕТ: Попробуйте read.xlsx из пакета xlsx. В файле справки подразумевается, что по умолчанию он оценивает формулы перед импортом (см. параметр keepFormulas). Я проверил это на небольшом тестовом файле, и у меня это сработало. Результаты формул были импортированы правильно, включая формулы, которые зависят от других листов в той же книге, и формулы, которые зависят от других книг в том же каталоге.

Одно предостережение: если внешний связанный лист изменился с момента последнего обновления ссылок на файл, который вы читаете в R, то любые значения, считанные в 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)
person eipi10    schedule 14.08.2015
comment
Я попробовал read.xlsx, следуя вашему коду, он очень медленный, почти через 10 минут код все еще работает. В электронной таблице 12378 строк, должно ли это быть проблемой? - person xyin; 14.08.2015
comment
Я удивлен, что это так медленно с листом такого размера (у вас много столбцов). Попробуйте read.xlsx2. Это быстрее, чем read.xlsx. См. справку read.xlsx о различиях между read.xlsx и read.xlsx2. - person eipi10; 14.08.2015
comment
Я только что замерил время двух функций в тестовом файле, содержащем около 1400 строк и 6 столбцов. Среднее время чтения: read.xlsx=5,9 с; read.xlsx2=0,13 сек. - person eipi10; 14.08.2015
comment
Исправление: read.xlsx2 приводит к NA для ячеек с формулами, так что это не сработает. Вам нужно придерживаться read.xlsx. - person eipi10; 14.08.2015
comment
Спасибо большое за вашу помощь! Да, read.xlsx2 генерирует NA для ячеек с формулами. У меня 40 столбцов, что, я считаю, тоже не так уж много. - person xyin; 14.08.2015
comment
Я просто считаю, что функция read.xls() в пакете gdata — хорошее решение! - person xyin; 14.08.2015
comment
Я попробовал read_excel(), это действительно быстрее, чем read.xls() из gdata. Спасибо большое за вашу помощь! - person xyin; 14.08.2015