Как сохранить файл в spss

Обновлено: 05.07.2024

Когда я только начал использовать R, мне потребовалось узнать ответы на те вопросы, которые раньше для меня таковыми не являлись, например:

Звучит знакомо? Думаю, да. Хорошо… давайте рассмотрим все внимательно и по порядку.

Нам нужен экспериментальный массив данных; скажем, вот этот:

ONE TWO AGE
1 2 a 42
2 1 a 18
3 3 b 49
4 2 a 62
5 1 b 25

Просто скопируйте это и вставьте в R:

Другой путь: вы можете выделить скопировать содержимое таблицы в буфер обмена и набрать следующую команду:

В обоих случаях должно получиться так:

Конечно, мы можем видеть (и редактировать) данные знакомым нам способом, используя команду fix(test) (но я никогда так не делал с того времени, как перешел на R).

Хорошо, далее несколько команд SPSS, выполнение которых в R может быть вам интересным.

Мы хотим отсортировать наши данные в возрастающем порядке по переменной ONE:

Ключ к пониманию этой команды (звучит как введение в R, но по вопросу основ лучше прочить руководство «Введение в R») лежит в том, как R индексирует строки и столбцы. Существует два ключевых инструмента, которые делают такую сортировку:

  • функция order() , смотрите справку через команду ?order;
  • содержимое, заключенное в квадратные скобки.

Мы можем захотеть отсортировать данные в убывающем порядке:

Также существует функция sort() , но необходимо понимать, что несмотря на кажущуюся схожесть выполняемых задач (сортировка элементов, эти функции действуют по-разному. Давайте для примера возьмем вектор символов:

Ага! Наш вектор отсортирован. Но в чем же отличия от функции order() ?

Теперь разница понятна: функция sort() использует индексы, возвращенные функцией order() .

Сортировка наблюдений массива данных имеет отношение к индексации; поэтому мы используем для этой цели функцию order() . Кажется несколько противоречащим здравому смыслу не использовать sort() для сортировки строк, но как только вы к этому привыкните, вы сразу почувствуете это естественным.

Это очень просто: мы можем индексировать массив данных используя «[ , ]».

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

Выберем все наблюдения, где переменная ONE равна 1:

Выберем все наблюдения, где переменная ONE равна 1, а переменная TWO равна « а »:

Выберем все наблюдения, где переменная ONE равна 2, а переменная AGE меньше, чем 60:

Конечно, если мы используем функцию attach() , то синтаксис будет еще проще:

Существует огромная разница между SPSS и R в подходе к категориальным переменным. Не кажется ли странным, что приложение стоимостью в несколько тысяч долларов, как, например, SPSS, даже не пытается вывести предупреждение, когда кто-либо высчитывает арифметическое среднее номинальной переменной? Невероятно…

Категории номинальных и порядковых переменных называются уровнями (levels).

Первое разительное отличие R заключается в том, что факторы не выводятся как номера. Давайте, для примера, возьмем переменную TWO из нашего массива:

Ага… уровни (наши «метки») уже здесь. У нас есть два уровня: «a» и «b». Теперь давайте предположим, что переменная TWO обозначает пол: двумя категориями «мужчина» («male») и «женщина» («female»). Мы легко можем поменять наши «метки»:

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

«Аргумент не является числовым или логическим». Точка.

Давайте попробуем следующим образом:

Обратите внимание на знаки «меньше» («<») между уровнями: их наличие говорит нам о том, что переменная является порядковой.

Теперь давайте присвоим нашей переменной метки значений, используя любой из приведенных способов:

> levels(test$ONE) <- c("Low", "Medium", "High")

Или, если вы предпочтете явно указать соответствие конкретного числа уровню:

Это еще проще, чем метки значений. Мне известно о двух способах.

Первый способ, это присвоение метки через функцию attr() .

Мы только что присвоили переменной TWO дополнительный атрибут под именем «label» (имя не играет никакой роли и могло быть другим, например «varlab»). Теперь давайте запросим метку (label) переменной TWO:

Второй способ, это использование функции label() из пакета Hmisc.

Эта функция делает то же самое, только в более интуитивной форме. Снова запросим метку:

Здесь трудно аргументировать, но эта задача, возможно, потребует от вас больше усилий, чем вы можете предполагать. Но, поскольку вы уже ступили на дорогу R и открытых исходников, почему бы не пойти до конца?

Есть два вопроса по поводу таблиц, по которым я должен вас убедить:

  • как таблица должна выглядеть?
  • каким легким способом таблицу можно вставить в документ?

Позвольте задать вам один вопрос: как много вы встречали публикаций с таблицами, отформатированными в стиле SPSS? Я попробую угадать и скажу: ни одной. Профессиональные журналы используют очень простое форматирование для таблиц, всего лишь несколько линий, чтобы разделить важное содержимое. Такие таблицы могут быть созданы с использованием специального программного обеспечения, например LaTeX.

Ниже приведена частотная таблица, созданная в SPSS для переменной ONE из нашего массива.

То же самое в R:

Определенная информация, линий вообще никаких. Нам нужен общий итог или доли? Это просто:

Функция table() очень мощна. Взгляните на нее и изучите, как она работает. Она вам действительно пригодится.

Существует множество способов, как вставить таблицу в текст. Это зависит от того, какое ПО вы используете:

Ну а если вдруг мне захочется создать в LaTeX точную копию таблицы SPSS, то я создам матричный объект (назовем его ONE), подобный этому:

И теперь генерируем код LaTeX следующим образом:

Запускаем полученный код в LaTeX и получаем таблицу:

Аккуратно, не правда ли? Это тот самый вид таблиц, который мы привыкли видеть в профессиональных журналах.

Это то же самое, что создать одну переменную на основе значений другой переменной; и перекодировка в ту же переменную тоже проста.

Предположим, мы хотим перекодировать переменную AGE в три категории: «Молодой», «Взрослый», «Пожилой». Мы создаем переменную AGEREC, значения которой по умолчанию являются пропущенными. Поскольку эта переменная у нас порядкового уровня, мы можем объявить ее таковой через функцию ordered() :

Порядок уровней берется из очередности, в которой мы их указали (Уровень «Молодой» будет первым).

Теперь мы просто используем мощь индексации, заложенной в R.

Результирующая переменная является фактором, значения уровней которого понятны интуитивно. Мы можем объявить порядок и значения уровней явно:

Еще один способ сделать то же самое, это использовать функцию recode() из пакета car.

Обратите внимание, что переменная, полученная в результате, не является фактором (не все символьные переменные имеют тип «фактор»). Мы можем использовать аргумент as.factor.result функции recode() , но по умолчанию это создаст уровни, упорядоченные по алфавиту, нам же больше понравится, если уровень «Молодой» будет первым.

Здесь трудно добавить что-то новое. Просто с левой и правой стороны оператора присваивания «<-» мы используем имя одной и той же переменной:

Единственная хитрость появляется при индексировании. Покажем на примере:

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

Естесственно, все остальные приемы с уровнями и упорядочиванием остаются в силе.

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

Поэтому вопрос: как сохранять что?

Поскольку R манипулирует большим количеством объектов, поэтому и понимает он много форматов данных (включая .sav и .por файлы).

Согласно информации, полученной при помощи команды ?data , существует четыре поддерживаемых формата данных со следующими расширениями:

  1. «.R», «.r»;
  2. «.RData», «rda»;
  3. «.tab», «.txt» или «.TXT»;
  4. «.csv», «.CSV».

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

Обычно, файлы, содержащие код R (то есть последовательность команд для выполнения), имеют расширение «.R».

Еще одно важное замечание: так как R может работать сразу с множеством объектов в памяти одновременно (представьте сразу два загруженных в память массива данных SPSS), он так же позволяет записывать несколько объектов в один файл.

В следующих примерах я буду предполагать, что чтение и запись файлов ведется в текущей директории (для справки см. ?getwd и ?setwd ).

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

Функция dump() записывает комбинацию команд (например, такие, как мы использовали для создания нашего пробного массива) и внутреннюю структуру массива данных.

Код R обычно записывается файлы с расширением «.R», поэтому мы выберем такое же расширение:

На следующем шаге мы можем использовать команды из файла «test.R» с использованием функции source() :

На диске файл «test.R» записан в обычном текстовом формате, поэтому он вполне читаем. Вы можете посмотреть на него, чтобы понять принцип работы dump() .

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

Синтакс функции очень прост:

Первое отличие от функции dump() : первый аргумент не заключен в кавычки. Чтобы понять, почему, обратитесь к справке по обеим функциям.

Чтение данных производится просто:

Дополнительно, если пользователь хочет сохранить все объекты, находящиеся в данный момент в памяти, мы можем сохранить все рабочее пространство, используя функцию save.image()

Функция dput() делает практически то же самое, что и dump() , но с одним отличием: результатом выполнения функции не являются инструкции R. Результат содержит в себе только внутреннюю структуру объекта.

Здесь мы использовали расширение имени файла «.Rdput» (расширение может быть любым). Очень полезно использовать аргумент control = "all": это даст гарантию, что внутренняя структура объекта будет записана в файл полностью (включая все атрибуты объекта).

Считываем данные с диска:

Для файлов, разделенных табуляцией, инструкция будет следующей:

Обычно, данные формата SPSS не имеют названий строк (подобно именам переменных). R, со своей стороны, такие имена содержит (еще одна причина предпочесть R), поэтому, если вы хотите получить имена переменных, установите значение соответствующего аргумента (header) в TRUE.

Функция read.table() одна из самых полезных, она имеет множество аргументов. Минимальная форма применения следующая:

Для файла со значениями, разделенными запятыми, команда такая же, только аргумент sep меняется:

Функция используется для быстрой записи в файл вектора или матрицы.

В случае с вектором, если он является символьным, в файл он будет записан по умолчанию в одну колонку; если вектор числовой, то необходимо использовать аргумент ncolumns:

В случае с матрицей, мы должны транспонировать ее перед тем, как записывать в файл:

Выходной файл не содержит имен строк и столбцов.

Данный подход рекомендуется для смелых пользователей.

Обратите внимание на наличие точек в начале названия функций.

Иногда возникает ситуация, когда необходимо сохранить объекты R в базе данных, подобных MySQL. Обычно это связано с тем, что массив данных очень большой.

Чтобы сериализовать объект, используйте функцию serialize() , чтобы обратить сериализованный объект в нормальное состояние, используйте unserialize() .

Функция .saveRDS() позволяет сохранить сериализованный объект в текущей директории, .readRDS() считывает его обратно.

Эта команда сохранит сжатый ASCII-вариант сериализованного объекта R. Если же вас интересует, как выглядит сериализованный объект, выполните следующее:

и теперь вы можете просмотреть структуру объекта, используя любой текстовый редактор.

Читайте также: