четверг, 18 декабря 2014 г.

Чтение файлов Excel из R

Многие люди хранят свои данные в файлах Microsoft Excel. Это не очень удачный выбор по многим причинам, но к сожалению, Excel уже стал стандартом де-факто во многих бизнес-приложениях, поэтому необходимо с этим считаться.
Для чтения файлов Excel в R было предложено множество решений, каждое со своими преимуществами и недостатками, но универсального решения пока нет. Ниже приведен обзор всех известных мне решений, чтобы вы могли сами выбрать подходящее вашим нуждам.

Сохранение файлов Excel в виде текста

Сохранив файл Excel в формате CSV, можно использовать для импорта данных нативные функции R: 

  read.table"myfile.csv", header  TRUE

Копирование и вставка из Excel в R

Это быстрое решение, но имеющее свои недостатки: вам необходимо отрыть файл Excel, выделить данные и скопировать их в буфер обмена. Но если вы торопитесь, то это наилучший выбор.


  read.table"clipboard"

Соединение ODBC

В течение многих лет это было самое простое решение на базе кода R для пользователей Windows. Сейчас оно все еще поддерживается для 32-битных версий R. Помимо Microsoft Windows и 32-битного дистрибутива R требуется также установленный драйвер Excel ODBC.

require(RODBC)
conn = odbcConnectExcel("myfile.xlsx") # open a connection to the Excel file
sqlTables(conn)$TABLE_NAME # show all sheets
df = sqlFetch(conn, "Sheet1") # read a sheet
df = sqlQuery(conn, "select * from [Sheet1 $]") # read a sheet (alternative SQL
 sintax)
close(conn) # close the connection to the file

Пакет gdata

По моему опыту функция, предлагаемая пакетом gdata, является хорошим кроссплатформенным решением. Она доступна в Windows, Mac и Linux. gdata требует, чтобы у вас были установлены дополнительные библиотеки Perl. Обычно Perl уже установлен в Linux и Mac, но в Windows это может потребовать дополнительных усилий.

require(gdata)
df = read.xls ("myfile.xlsx"), sheet = 1, header = TRUE)

Пакет xlsReadWrite

xlsReadWrite приведен здесь только для полноты картины, хотя он и очень быстр: он не поддерживает файлы формата .xlsx, а в настоящее время это неприемлемо. Кроме того, он использует сторонний код, который необходимо скачивать с GitHub. Этот пакет доступен только в Windows.

require(xlsReadWrite)
xls.getshlib()
df = read.xls("myfile.xls", sheet = 1)

Пакет XLConnect

XLConnect - это решение на базе Java, поэтому он кроссплатформенный и показывает удовлетворительные результаты. При больших объемах данных он может быть очень медленным.

require(XLConnect)
wb = loadWorkbook("myfile.xlsx")
df = readWorksheet(wb, sheet = "Sheet1", header = TRUE)

Пакет xlsx

Пакет xlsx читает (и записывает) файлы .xlsx и .xls, используя Java. Он кроссплатформенный и использует rJava для взаимодействия с Java. Приведенные ниже комментарии и примеры взяты из ответа с stackoverflow. Этот пакет обеспечивает, вероятно, наилучшие результаты, но требует знания достаточно большого количества опций.
Однако функция read.xlsx() при открытии больших файлов может работать достаточно медленно. Функция read.xlsx2() работает значительно быстрее, но не определяет класс vector для столбцов data.frame. Если вы используете функцию read.xlsx2(), вам необходимо задавать требуемые классы столбцов с помощью команды colClasses().

require(xlsx)
read.xlsx("myfile.xlsx", sheetName = "Sheet1")
read.xlsx2("myfile.xlsx", sheetName = "Sheet1")
require(xlsx)
coln = function(x) { # A function to see column numbers
  y = rbind(seq(1, ncol(x)))
  colnames(y) = colnames(x)
  rownames(y) = "col.number"
  return(y)
}
data = read.xlsx2("myfile.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("myfile.xlsx", 1, 
  colClasses = c(rep("character", x), rep("numeric", ncol(data)-x+1))
)

Написанные собственноручно функции

В конце концов я нашел сайт с самодельной функцией для быстрого импорта файлов xlsx. Она должна работать на любой платформе и использует XML. Она не работает со старыми файлами формата xls. Функция позволяет читать несколько таблиц из файла одновременно с помощью аргумента keep_sheets.

source("https://gist.github.com/schaunwheeler/5825002/raw/3526a15b032c06392740e20
b6c9a179add2cee49/xlsxToR.r")
xlsxToR = function("myfile.xlsx", header = TRUE)
 
Я для работы с R всегда предпочитал использовать файлы в формате csv. Но для небольших наборов данных или для тестовых задач для себя я выбрал XLConnect.

Перевод. Оригинал здесь.

Комментариев нет:

Отправить комментарий