12 ответов:
да. Смотрите соответствующая страница на R wiki. Короткий ответ:
read.xlsсgdataпакет работает большую часть времени (хотя вам нужно установить Perl в вашей системе-обычно уже верно на MacOS и Linux, но делает дополнительный шаг на Windows, т. е. см. http://strawberryperl.com/). Существуют различные предостережения и альтернативы, перечисленные на странице R wiki.единственная причина, по которой я не вижу, чтобы сделать это напрямую, заключается в том, что вы можете изучить электронная таблица, чтобы увидеть, есть ли у нее глюки (странные заголовки, несколько листов [вы можете читать только по одному за раз, хотя вы можете явно перебирать их все], включенные графики и т. д.). Но для хорошо сформированной прямоугольной электронной таблицы с простыми числами и символьными данными (т. е. не отформатированными запятыми числами, датами, формулами с ошибками деления на ноль, пропущенными значениями и т. д. так далее. ..) У меня вообще нет проблем с этим процессом.
позвольте мне повторить то, что @Chase рекомендовал: используйте XLConnect.
причины использования XLConnect, на мой взгляд:
Кросс. XLConnect написан на Java и, таким образом, будет работать на Win, Linux, Mac без изменения вашего кода R (за исключением, возможно, строк пути)
- больше нечего загружать. Просто установите XLConnect и продолжайте жить.
- вы только упомянули чтение файлов 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так
readxlis явным победителем, когда дело доходит до скорости.gdataлучше иметь что-то еще для этого, так как это болезненно медленно в чтении файлов Excel, и эта проблема только усугубляется для больших таблиц.две ничьи в размере
openxlsxявляются 1) его обширные другие методы (readxlпредназначен только одна вещь, которая, вероятно, является частью того, почему это так быстро), особенно егоwrite.xlsxфункция, и 2) (больше недостатка дляreadxl) the
Мне повезло с
XLConnect: http://cran.r-project.org/web/packages/XLConnect/index.html
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 и могу рекомендовать его.
другое решение-это
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