Чтение файла Excel непосредственно из сценария R



Как я могу прочитать файл Excel непосредственно в R? Или я должен сначала экспортировать данные в текстовый или CSV файл и импортировать этот файл в R?

1024   12  

12 ответов:

да. Смотрите соответствующая страница на R wiki. Короткий ответ: read.xls с gdata пакет работает большую часть времени (хотя вам нужно установить Perl в вашей системе-обычно уже верно на MacOS и Linux, но делает дополнительный шаг на Windows, т. е. см. http://strawberryperl.com/). Существуют различные предостережения и альтернативы, перечисленные на странице R wiki.

единственная причина, по которой я не вижу, чтобы сделать это напрямую, заключается в том, что вы можете изучить электронная таблица, чтобы увидеть, есть ли у нее глюки (странные заголовки, несколько листов [вы можете читать только по одному за раз, хотя вы можете явно перебирать их все], включенные графики и т. д.). Но для хорошо сформированной прямоугольной электронной таблицы с простыми числами и символьными данными (т. е. не отформатированными запятыми числами, датами, формулами с ошибками деления на ноль, пропущенными значениями и т. д. так далее. ..) У меня вообще нет проблем с этим процессом.

позвольте мне повторить то, что @Chase рекомендовал: используйте XLConnect.

причины использования XLConnect, на мой взгляд:

    Кросс. XLConnect написан на Java и, таким образом, будет работать на Win, Linux, Mac без изменения вашего кода R (за исключением, возможно, строк пути)
  1. больше нечего загружать. Просто установите XLConnect и продолжайте жить.
  2. вы только упомянули чтение файлов Excel, но XLConnect также будет писать Файлы Excel, включая изменение форматирования ячеек. И он будет делать это с Linux или Mac, а не просто выигрывать.

XLConnect является несколько Новым по сравнению с другими решениями, поэтому он реже упоминается в сообщениях блога и справочных документах. Для меня это было очень полезно.

и вот тут readxl:

пакет readxl позволяет легко получить данные из Excel и в R. По сравнению с существующими пакетами (например, gdata, xlsx, xlsReadWrite и т. д) readxl не имеет внешних зависимостей, поэтому его легко установить и использовать все операционные системы. Он предназначен для работы с табличными данными, хранящимися на одном листе.

readxl построен поверх библиотеки libxls C, которая абстрагируется многие сложности базового двоичного формата.

Он поддерживает как старые .формате xls и .XLSX-файл

readxl доступен из CRAN, или вы можете установить его из github с помощью:

# install.packages("devtools")
devtools::install_github("hadley/readxl")

использование

library(readxl)

# read_excel reads both xls and xlsx files
read_excel("my-old-spreadsheet.xls")
read_excel("my-new-spreadsheet.xlsx")

# Specify sheet with a number or name
read_excel("my-spreadsheet.xls", sheet = "data")
read_excel("my-spreadsheet.xls", sheet = 2)

# If NAs are represented by something other than blank cells,
# set the na argument
read_excel("my-spreadsheet.xls", na = "NA")

обратите внимание, что хотя в описании говорится "нет внешних зависимостей", для этого требуется Rcpp пакета, что в свою очередь требует Rtools (для Windows) или Xcode (для OSX), который are зависимости, внешние по отношению к R. Хотя у многих людей они установлены по другим причинам.

редактировать 2015-Октябрь: как другие прокомментировали здесь openxlsx и readxl пакеты намного быстрее, чем xlsx пакет и на самом деле удается открыть большие файлы Excel (>1500 строк и > 120 столбцов). @MichaelChirico демонстрирует, что readxl лучше, когда скорость предпочтительнее и openxlsx заменяет функциональность, предоставляемую . Если вы ищете пакет для чтения, записи и изменения файлов Excel в 2015, выберите openxlsx вместо xlsx.

Pre-2015: я использовал xlsxпакета. Это изменило мой рабочий процесс с Excel и R. больше нет раздражающих всплывающих окон, спрашивающих, если я уверен, что хочу сохранить свой лист Excel .формат txt. Пакет также записывает файлы Excel.

однако, я нахожу read.xlsx функция медленная, при открытии больших файлов Excel. read.xlsx2 функция значительно быстрее, но не ставит под сомнение векторный класс данных.рамка столбцы. Вы должны использовать colClasses команда для указания нужных классов столбцов, если вы используете . Вот практический пример:

read.xlsx("filename.xlsx", 1) читает файл и делает данные.классы столбцов фрейма почти полезны, но очень медленны для больших наборов данных. Работает также для .xls файлы.

read.xlsx2("filename.xlsx", 1) быстрее, но вам придется определить классы столбцов вручную. Ярлык должен выполнить команду дважды (см. пример ниже). character спецификация преобразует ваши колонки к факторам. Используйте Dateи POSIXct функции по времени.

coln <- function(x){y <- rbind(seq(1,ncol(x))); colnames(y) <- colnames(x)
rownames(y) <- "col.number"; return(y)} # A function to see column numbers

data <- read.xlsx2("filename.xlsx", 1) # Open the file 

coln(data)    # Check the column numbers you want to have as factors

x <- 3 # Say you want columns 1-3 as factors, the rest numeric

data <- read.xlsx2("filename.xlsx", 1, colClasses= c(rep("character", x),
rep("numeric", ncol(data)-x+1)))

учитывая распространение различных способов чтения файла Excel в R и множество ответов здесь, я думал, что попытаюсь пролить свет на то, какие из упомянутых здесь вариантов лучше всего работают (в нескольких простых ситуациях).

я сам использую xlsx так как я начал использовать R, по инерции, если ничего другого, и я недавно заметил, что, похоже, нет никакой объективной информации о том, какой пакет работает лучше.

любой бенчмаркинг-упражнение чревато трудностями, поскольку некоторые пакеты обязательно справятся с определенными ситуациями лучше, чем другие, и водопад других предостережений.

тем не менее, я использую (воспроизводимый) набор данных, который, как я думаю, находится в довольно распространенном формате (8 строковых полей, 3 числовых, 1 целое число, 3 даты):

set.seed(51423)
data.frame(
  str1 = sample(sprintf("%010d", 1:NN)), #ID field 1
  str2 = sample(sprintf("%09d", 1:NN)),  #ID field 2
  #varying length string field--think names/addresses, etc.
  str3 = 
    replicate(NN, paste0(sample(LETTERS, sample(10:30, 1L), TRUE),
                         collapse = "")),
  #factor-like string field with 50 "levels"
  str4 = sprintf("%05d", sample(sample(1e5, 50L), NN, TRUE)),
  #factor-like string field with 17 levels, varying length
  str5 = 
    sample(replicate(17L, paste0(sample(LETTERS, sample(15:25, 1L), TRUE),
                                 collapse = "")), NN, TRUE),
  #lognormally distributed numeric
  num1 = round(exp(rnorm(NN, mean = 6.5, sd = 1.5)), 2L),
  #3 binary strings
  str6 = sample(c("Y","N"), NN, TRUE),
  str7 = sample(c("M","F"), NN, TRUE),
  str8 = sample(c("B","W"), NN, TRUE),
  #right-skewed integer
  int1 = ceiling(rexp(NN)),
  #dates by month
  dat1 = 
    sample(seq(from = as.Date("2005-12-31"), 
               to = as.Date("2015-12-31"), by = "month"),
           NN, TRUE),
  dat2 = 
    sample(seq(from = as.Date("2005-12-31"), 
               to = as.Date("2015-12-31"), by = "month"),
           NN, TRUE),
  num2 = round(exp(rnorm(NN, mean = 6, sd = 1.5)), 2L),
  #date by day
  dat3 = 
    sample(seq(from = as.Date("2015-06-01"), 
               to = as.Date("2015-07-15"), by = "day"),
           NN, TRUE),
  #lognormal numeric that can be positive or negative
  num3 = 
    (-1) ^ sample(2, NN, TRUE) * round(exp(rnorm(NN, mean = 6, sd = 1.5)), 2L)
)

затем я написал это в csv и открыл в LibreOffice и сохранил его как an .xlsx файл, а затем бенчмаркинг 4 пакетов, упомянутых в этой теме: xlsx,openxlsx,readxl и gdata, используя параметры по умолчанию (я также попробовал версию того, указываю ли я типы столбцов, но это не изменило рейтинг).

я кроме RODBC потому что я на Linux; XLConnect потому что кажется, что его основная цель-не чтение в отдельных листах Excel, а импорт целых книг Excel, поэтому ставить свою лошадь в гонку только на свои возможности чтения кажется несправедливым; и xlsReadWrite потому что он больше не совместим с моя версия R (кажется, был постепенно прекращен).

я тогда пробежал тесты с NN=1000L и NN=25000L (сброс семени перед каждым объявлением data.frame выше), чтобы учесть различия в отношении размера файла Excel. gc в первую очередь xlsx, который я нашел время от времени может создавать засоры памяти. Без дальнейших церемоний, вот результаты, которые я нашел:

1000-Строковый Файл Excel

benchmark1k <-
  microbenchmark(times = 100L,
                 xlsx = {xlsx::read.xlsx2(fl, sheetIndex=1); invisible(gc())},
                 openxlsx = {openxlsx::read.xlsx(fl); invisible(gc())},
                 readxl = {readxl::read_excel(fl); invisible(gc())},
                 gdata = {gdata::read.xls(fl); invisible(gc())})

# Unit: milliseconds
#      expr       min        lq      mean    median        uq       max neval
#      xlsx  194.1958  199.2662  214.1512  201.9063  212.7563  354.0327   100
#  openxlsx  142.2074  142.9028  151.9127  143.7239  148.0940  255.0124   100
#    readxl  122.0238  122.8448  132.4021  123.6964  130.2881  214.5138   100
#     gdata 2004.4745 2042.0732 2087.8724 2062.5259 2116.7795 2425.6345   100

так readxl победитель, с openxlsx конкурентоспособная и gdata явный лузер. Принимая каждую меру относительно минимума столбца:

#       expr   min    lq  mean median    uq   max
# 1     xlsx  1.59  1.62  1.62   1.63  1.63  1.65
# 2 openxlsx  1.17  1.16  1.15   1.16  1.14  1.19
# 3   readxl  1.00  1.00  1.00   1.00  1.00  1.00
# 4    gdata 16.43 16.62 15.77  16.67 16.25 11.31

мы видим, моя любимая, xlsx на 60% медленнее, чем readxl.

25,000-Row Excel File

из-за количества времени, которое требуется, я сделал только 20 повторений на большом файле, в противном случае команды были идентичны. Вот исходные данные:

# Unit: milliseconds
#      expr        min         lq       mean     median         uq        max neval
#      xlsx  4451.9553  4539.4599  4738.6366  4762.1768  4941.2331  5091.0057    20
#  openxlsx   962.1579   981.0613   988.5006   986.1091   992.6017  1040.4158    20
#    readxl   341.0006   344.8904   347.0779   346.4518   348.9273   360.1808    20
#     gdata 43860.4013 44375.6340 44848.7797 44991.2208 45251.4441 45652.0826    20

вот относительные данные:

#       expr    min     lq   mean median     uq    max
# 1     xlsx  13.06  13.16  13.65  13.75  14.16  14.13
# 2 openxlsx   2.82   2.84   2.85   2.85   2.84   2.89
# 3   readxl   1.00   1.00   1.00   1.00   1.00   1.00
# 4    gdata 128.62 128.67 129.22 129.86 129.69 126.75

так readxl is явным победителем, когда дело доходит до скорости. gdata лучше иметь что-то еще для этого, так как это болезненно медленно в чтении файлов Excel, и эта проблема только усугубляется для больших таблиц.

две ничьи в размере openxlsx являются 1) его обширные другие методы (readxl предназначен только одна вещь, которая, вероятно, является частью того, почему это так быстро), особенно его write.xlsx функция, и 2) (больше недостатка для readxl) the

library(RODBC)
file.name <- "file.xls"
sheet.name <- "Sheet Name"

## Connect to Excel File Pull and Format Data
excel.connect <- odbcConnectExcel(file.name)
dat <- sqlFetch(excel.connect, sheet.name, na.strings=c("","-"))
odbcClose(excel.connect)

лично мне нравится RODBC и могу рекомендовать его.

просто дал пакет openxlsx попробовать сегодня. Он работал очень хорошо (и быстро).

http://cran.r-project.org/web/packages/openxlsx/index.html

другое решение-это xlsReadWrite пакет, который не требует дополнительных установок, но требует, чтобы вы загрузили дополнительный shlib перед его первым использованием:

require(xlsReadWrite)
xls.getshlib()

забвение этого может вызвать полное разочарование. Был там и все такое...

на боковой заметке: вы можете рассмотреть возможность преобразования в текстовый формат (например, csv) и читать оттуда. Это по ряду причин :

  • независимо от вашего решения (RODBC, gdata, xlsReadWrite) некоторые странные вещи могут произойти, когда ваши данные преобразуются. Особенно даты могут быть довольно громоздкими. Элемент HFWutils пакет имеет некоторые инструменты для работы с датами EXCEL (за комментарий @Ben Bolker).

  • если у вас есть большие листы, чтение в текстовых файлах происходит быстрее, чем чтение из EXCEL.

  • для .xls и .xlsx файлы, различные решения могут быть необходимый. Например, пакет xlsReadWrite в настоящее время не поддерживает .контакты насколько мне известно. gdata требуется установить дополнительные библиотеки Perl для .поддержка xlsx. xlsx пакета могут обрабатывать расширения с тем же именем.

=1/3 в ячейку в excel. Теперь уменьшите количество видимых вам десятичных знаков до двух. Затем скопируйте и вставьте данные в R. Теперь сохраните CSV. Вы заметите, что в обоих случаях в Excel полезно только сохранить данные, которые были видны вам через интерфейс, и вы потеряли всю точность в ваших фактических исходных данных.

расширяя ответ, предоставленный @Mikko, вы можете использовать аккуратный трюк, чтобы ускорить процесс без необходимости "знать" свои классы столбцов заранее. Просто используйте read.xlsx чтобы захватить ограниченное количество записей для определения классов, а затем следовать за ним с read.xlsx2

пример

# just the first 50 rows should do...
df.temp <- read.xlsx("filename.xlsx", 1, startRow=1, endRow=50) 
df.real <- read.xlsx2("filename.xlsx", 1, 
                      colClasses=as.vector(sapply(df.temp, mode)))

файл Excel можно прочитать непосредственно в R следующим образом:

my_data <- read.table(file = "xxxxxx.xls", sep = "\t", header=TRUE)

чтение файлов xls и xlxs с помощью пакета readxl

library("readxl")
my_data <- read_excel("xxxxx.xls")
my_data <- read_excel("xxxxx.xlsx")

Comments

    Ничего не найдено.