Процедура write.xlsx, а лучше write.xlsx2



Федеральное государственное образовательное бюджетное учреждение

Высшего образования

«ФИНАН

«ФИНАНСОВЫЙ УНИВЕРСИТЕТ ПРИ ПРАВИТЕЛЬСТВЕ

РОССИЙСКОЙ ФЕДЕРАЦИИ»

Департамент анализа данных, принятия решений и финансовых технологий

 

С.А.Зададаев

 

 

Сохранение результатов в R и импорт/экспорт

Данных из Excel(R S tudio)

Учебно-методические рекомендации для проведения

семинара №26 по компьютерному практикуму

 

Для бакалавров направления 38.03.01 «Экономика»

 

 

Электронное издание

 

 

Москва 2017

Сохранение результатов в R и импорт/экспорт

Данных из Excel(R S tudio)

Вэтом разделе мы обсудим возможные коммуникации Rс данными MSExcel и общие способы хранения/записи результатов работы в R.

 

Команда read.table

Напомним, что универсальным средством обмена данными между Excel и R может выступать буфер обмена. Так, команда read.table:

Data<- read.table("clipboard", h=TRUE, dec=",", sep = "\t") # Чтение из буфера обмена данных excel-формата в таблицу data.frame c заголовками столбцов

производит чтение данных Excel-формата из буфера обмена в переменную Data типа data.frame, при этом параметр hотвечает за то, требуется ли считать первую строку таблицы именами столбцов или нет.

Обратная командаwrite.table:

write.table(Data, "clipboard", quote=FALSE, col.names = TRUE, row.names = FALSE, sep = "\t", dec=",") # Запись в буфер обмена данныхвExcel-формате

производит запись данных таблицы Dataиз R в буфер обмена в Excel-формате.

Напомним также, что вместо буфера обмена "clipboard"может стоять полный адрес к текстовому файлу, записанный прямым слешом(/), например,"C:/Users/User/Desktop/data.txt".

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

Процедура read.csv или read.csv2

    Действие указанной в заголовке процедуры аналогично read.table,но применяется она для чтения данных из Excel-файлов c расширением .csv (файлы, данные которых разделены запятой). В России с такими файлами особо не работают из-за того, что у нас запятая – это десятичный разделитель, а не разделитель данных. Конечно, можно искусственно такой «российский»файл сохранить под расширением .csv, но это все-равно не сделает его подходящим.

Для того, чтобы файл стал действительно с разделяющими запятыми, а десятичным разделителем была бы у него точка – требуется существенная перенастройка MSExcel, что не всегда удобно для обычной повседневной работы.

    Вывод прост: используйте эти команды (без разницы read.csv или read.csv2) только для чтенияаутентичных csv-файлов изевропейских или американских источников:

Data<- read.csv("Путь и имя файла.csv", header=TRUE) # Чтение данных из excel-файла форматаcsv

write.csv(Data, "Путь и имя файла.csv ", col.names = TRUE, row.names = FALSE) # Запись таблицы Data из Rв Excel-файл форматаcsv

    Замечание.Здесь и далеев указанных примерах, разумеется, можно менять значения параметров, а справка по их исчерпывающему перечню, как обычно, доступна по F1.

Замечание. Разница между операторами read.csv и read.csv2 следующая: read.csv – оперирует с разделителями данных в виде запятых, а read.csv2 – с разделителями данных в виде точки с запятой, однако, десятичным разделителем у них всегда используетсяточка!

 

Библиотека "xlsx"

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

Но прежде, чем приступить к обсуждению команд чтения/записи таких файлов, необходимо установить мощную библиотеку "xlsx", которая в свою очередь не будет корректно работать без предварительной установки на компьютер объектно-ориентированного языка программирования Java. Мы, конечно, не собираемся сейчас учиться программировать на Java, но библиотека "xlsx" использует объекты Javaи без установки последней не обойтись.

    Как проверить: стоит ли на компьютере Java? Просто начнем устанавливать пакет "xlsx" (можно стандартно из меню Tools – Install Packages…) и посмотрим на сообщения об ошибках. Если ошибок нет – Javaприсутствует.

В противном случае устанавливаем пакет Java, пройдя последовательно по двум ссылкам ниже, ноне забудьте при этом выбрать соответствующую операционную систему и принять все умолчания, нажав после вопросов «ok»:

1. https://java.com/ru/download/

2. http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Теперь снова повторяем установку пакета "xlsx"(на этот раз уже удачную).

Создадим новый документ в R и подключим две необходимые нам в дальнейшем библиотеки:

# Загружаем библиотеки:

library("xlsx")   # Для считывания данных из excel-файлов типа xlsx

library("dplyr")  # Для glimpse и select  

Процедураread.xlsx

Задание 1. Создать Excel-файл, содержащий на первом листе следующую таблицу:

Сохранить его на рабочем столе под именем data.xlsxи загрузить его данные в R без использования буфера обмена.

Решение. Введем указанную таблицу в ячейки файла и сохраним его как книгу Excel:

    Далее нам необходимо прописать путь к этому файлу. Самый техничный способ – это указать мышью на файл data.xlsx и, удерживая нажатыми клавиши CtrlиShift, нажатьправую кнопку мыши, после чего выбрать пункт «Копировать как путь»:

    В итоге в буфере обмена находится путь к нашему файлу. Однако вставить его в соответствующую команду R нужно с некоторыми изменениями. Образуем в R текстовую переменную PATH, в которую скопируем из буфера обмена наш путь (Ctrl+v):

PATH <- "C:\Users\User\Desktop\data.xlsx"  # Неправильный путь к файлу из буфера!!!

и обязательно вставим к каждому обратному слешу (\) еще такой же:

PATH <- "C:\\Users\\User\\Desktop\\data.xlsx" # Корректный путь к файлу

Это и есть одна из корректных форм записи пути в R.

Теперь нам остается задать саму команду чтения таблицы данных с первого листа Excel-файла, путь к которому мы указали в переменной PATH:

Data<- read.xlsx(PATH, 1,encoding = "UTF-8",header = TRUE) # Считывается 1-ый лист из указанной книги Excel

    Интересно, что если бы имя нашего листа было написано латиницей: не "Лист1", а скажем, "List1", то мы могли бы обратиться к нему не по номеру (индексу), а по имени:

Data <- read.xlsx(PATH, "List1", encoding = "UTF-8", header = TRUE) # Считываетсялист "List1" изуказаннойкниги Excel

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

Посмотрим результат:

glimpse(Data)       # Смотрим структуру Data

Data                      # Смотрим саму таблицу данных Data

Обратите внимание, что glimpse(Data) сообщает о наличии трех столбцов в таблице Data (тип data.frame): Data$Дата, Data$USD и Data$EUR.

Также можно заметить, что десятичные разделители из запятых превратились в точки, а даты оказались автоматически распознаны в R, и их форматизменен на европейский.

Процедура write.xlsx, а лучше write.xlsx2

Задание 2. Переставить в Rвторой и третий столбцы таблицы Data из предыдущего задания и записать полученную таблицу на новый лист файла data.xlsx.

Решение. Образуем новую таблицу Data2, равную Datac переставленными столбцами:

Data2 <- select(Data, Дата, EUR, USD) # Выбираем в новую таблицу Data2 нужные столбцы из таблицы Data в указанном порядке:Дата, EUR, USD

Data2                            # Смотрим что получилось  

С отчетом в R-консоли:

> Data2 <- select(Data, Дата, EUR, USD)

> Data2

   Дата EUR USD

1 2017-09-30 68.4483 58.0169

2 2017-09-29 68.6441 58.4255

3 2017-09-28 68.1678 58.0102

    Теперь запишем данные Data2 в существующий файл data.xlsxна новый лист c именем "New":

write.xlsx2(Data2, PATH, sheetName="New", col.names=T, row.names=F, append=TRUE, showNA=FALSE) # Запись Data2 всуществующийфайл

    Важно, чтобы при запуске этой команды сам файл, указанный в пути PATH, был закрыт. Если файл будет открыт в Excel, R не сможет записать в него данные и выдаст ошибку. Так же к ошибке приведет и попытка записать данные на уже существующий лист данного файла. Замечание. Эту команду фактически нельзя запускать два раза подряд, т.к. после первого раза будет создан лист "New" и для второго запуска лист "New" уже не будет новым.

    В нашем случае все сработало корректно и после открытия файла data.xlsxубеждаемся в появлении нового листа "New" с заявленными данными:

Правда, дату R вернул все-таки в европейской транскрипции.

Если мы хотим образовать новый файл, то параметр append должен быть равен FALSE или сокращенно F. Следующие две строчки создадут новый файл data2.xlsxс листом "New" по адресу "C:\\Users\\User\\Desktop\\data2.xlsx":

PATH2 <- "C:\\Users\\User\\Desktop\\data2.xlsx"

write.xlsx2(Data2, PATH2, sheetName="New", col.names=T, row.names=F, append=F, showNA=FALSE) # Запись Data2 вновыйфайл

    При записи командой write.xlsx2 нужно помнить, что записываемый в xlsx-файл объект Rдолжен быть таблицей, т.е. типа data.frame. Часто внутренние данные в R могут быть списками, но формально не приведенными к фреймам. В этом случаенеобходимо перед записью дополнительно использовать команду:

Data2 <- as.data.frame(Data2) # Объявить Data2 типомdata.frame

которая устанавливает требуемый тип объекта Data2.

 

Формат RDS

    В заключение нельзя не сказать о замечательном собственном R-формате файлов, в которые можно сохранять любые R-объекты. Такие файлы имеют расширение .rds и создаются с помощью командыsaveRDS:

saveRDS(file = "Путь и имя файла.rds", Data) # Сохранение в файл формата .rdsобъекта Data

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

    Обратно считать данные таких файлов позволяет командаreadRDS:

Data<- readRDS("Путь и имя файла.rds") # Считать данные из файла формата .rds в Data

результатом которой станет запись в переменнуюData того объекта, который ранее был записан в rds-файл.

 

Задание 3.Сохранить в файл data.rdsвектор  и текст "Пушкин – наше всё!", а затем обратно считать эти данные из созданного файла.

Решение. Объявим в Rвектор  и текст "Пушкин – наше всё!":

a <- 1:3; a         # Задаем вектор a с координатами (1,2,3)

t<- "Пушкин – наше всё!"; t # Задаем текст в переменной t

    Для того, чтобы одновременно записать эти два объекта в файл создадим объединяющий их список L:

L<- list(Vector = a,Text = t)       # Задаем список, содержащий вектор a и текст t

После чего записываем этот список L в файл:

saveRDS(file = "data.rds", L) # Сохранение в файл data.rdsсписка L

Обратите внимание на то, что мы не указали путь к файлу, и поэтому он будет создан в рабочей директории текущего сеансаR. Проверьте это. Узнать и изменить рабочую директорию можно через менюTools – GlobalOptions – defaultworkingdirectory…:

    Теперь считаем данные из только что созданного файла командой:

Data<- readRDS("data.rds") # Считать данные из файла data.rds в Data

Data                                        # Посмотреть что находится в Data

Но в таких случаях лучше воспользоваться командой glimpseизпакета dplyr, т.к. данные могут быть в общем случае громоздкими и не помещаться на экран:

glimpse(Data) # Посмотреть структуру объекта Data

Как видим, считанный из файла data.rds объект Data содержит два поля: Vector и Text, т.е. можно непосредственно вернуть наш вектор командойData$Vector и записанный текст командой Data$Text:

a <- Data$Vector; a         # Записатьв a вектор

t <- Data$Text;t            # Записать в t текст

с отчетом в консоли

> a <- Data$Vector; a         # Записать в a вектор

[1] 1 2 3

> t <- Data$Text;t            # Записать в t текст

[1] "Пушкин – наше всё!"


Дата добавления: 2021-11-30; просмотров: 48; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!