З spss в r

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

Звучить знайомо? Думаю так. Добре. давайте розглянемо всі уважно і по порядку.

По-перше, перехід на R - це зміна в сприйнятті. Бачити дані - це схоже на наркотичну залежність, від якої потрібно позбутися: вам не потрібно їх бачити. І ви їх, дійсно, не бачите, оскільки те, що пропонує SPSS - це тільки маленький прямокутний шматочок від великого масиву. Ця маленька зорова хитрість, яку ви можете здійснити і в R з використанням простих команд.

Нам потрібен експериментальний масив даних; скажімо, ось цей:

Просто скопіюйте це і вставте в R:

Інший шлях: ви можете виділити скопіювати вміст таблиці в буфер обміну і набрати наступну команду:

В обох випадках повинно вийти так:

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

Добре, далі кілька команд SPSS, виконання яких в R може бути вам цікавим.

Ми хочемо впорядкувати наші дані в порядку зростання по змінної ONE:

Ключ до розуміння цієї команди (звучить як введення в R, але з питання основ краще пророкувати керівництво «Введення в R») лежить в тому, як R індексує рядки і стовпці. Існує два ключових інструменту, які роблять таке сортування:

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

Квадратні дужки містять інформацію для індексування: перед коми вказана індексація для рядків, після коми - для колонок. Функція, вміщена перед коми, вказує на те, що ми хочемо зробити з рядками нашого масиву (і це саме те, що ми хочемо зробити: впорядкувати спостереження, тобто рядки).

Ми можемо захотіти впорядкувати дані в порядку спадання:

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

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

order () повертає вектор індексів. Останній символ в нашому векторі - це «а» (п'ята позиція), яка в векторі, повернутим функцією order (). знаходиться на п'ятій позиції (число 5 повертається першим). І так далі:

Тепер різниця зрозуміла: функція sort () використовує індекси, повернуті функцією order ().

Сортування спостережень масиву даних має відношення до індексації; тому ми використовуємо для цієї мети функцію order (). Здається кілька суперечить здоровому глузду не використовувати sort () для сортування рядків, але як тільки ви до цього звикнете, ви відразу відчуєте це природним.

Це дуже просто: ми можемо індексувати масив даних використовуючи «[. ] ».

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

Виберемо всі спостереження, де змінна ONE дорівнює 1:

Виберемо всі спостереження, де змінна ONE дорівнює 1, а змінна TWO дорівнює «а»:

Виберемо всі спостереження, де змінна ONE дорівнює 2, а змінна AGE менше, ніж 60:

Звичайно, якщо ми використовуємо функцію attach (). то синтаксис буде ще простіше:

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

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

"Аргумент не є числовим або логічним". Крапка.

Ви можете подумати, що використання міток замість номерів - це нерозумно (правда, і я думав також). Чому хтось захоче так робити? Коли ми вводимо дані, ми використовуємо цифри, а не букви. Так в чому ж заковика? Справа в тому, що те, що ви бачите на екрані - це зовсім не те, що збережено в базі даних. Сховище (якщо я не помиляюся) складається з чисел, R тільки друкує на екрані рівні за замовчуванням.

Давайте спробуємо в такий спосіб:

Так. чоловіки - це 1, жінки - 2.

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

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

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

Або, якщо ви віддасте перевагу явно вказати відповідність конкретного числа рівню:

Це ще простіше, ніж мітки значень. Мені відомо про два способи.

Перший спосіб, це привласнення мітки через функцію attr ().

Ми тільки що привласнили змінною TWO додатковий атрибут під ім'ям "label" (ім'я не має ніякого значення і могло бути іншим, наприклад "varlab"). Тепер давайте запитаємо мітку (label) змінної TWO:

Другий спосіб, це використання функції label () з пакету Hmisc.

Ця функція робить те ж саме, тільки в більш інтуїтивною формі. Знову запитаємо мітку:

Тут важко аргументувати, але ця задача, можливо, зажадає від вас більше зусиль, ніж ви можете припустити. Але, оскільки ви вже ступили на дорогу R і відкритих початкових кодів, чому б не піти до кінця?

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

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

Це може прозвучати непереконливо, але. вам не потрібні таблиці з форматуванням в стилі SPSS. Проблема дійсно в цьому: таблиці SPSS занадто "заформатіровани". Занадто багато виділень, занадто багато ліній, занадто багато прямокутників. Все це так привабливо, що відволікає увагу від головного в таблиці - числа в ній.

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

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

Те ж саме в R:

Певна інформація, ліній взагалі ніяких. Нам потрібен загальний підсумок або частки? Це просто:

Функція table () дуже потужна. Погляньте на неї і вивчіть, як вона працює. Вона вам дійсно знадобиться.

Існує безліч способів, як вставити таблицю в текст. Це залежить від того, яке ПЗ ви використовуєте:

  • Для LaTeX я б знову використав пакет Hmisc. У нього входить спеціальна функція для створення LaTeX-таблиць (вас може зацікавити функція Sweave ())
  • Для OpenOffice.org існує інший чудовий пакет під назвою odfWeave. який виконує ту ж саму задачу, що і Sweave (). але в документі OpenOffice. Вам навіть не потрібно копіювати і вставляти таблиці або діаграми: просто напишіть код програми R в своєму документі, пропустіть його через R (так-так, R може так зробити) і на виході ви отримаєте новий документ ODF з таблицями і діаграмами саме в тих місцях , де ви написали код.

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

І тепер генеруємо код LaTeX наступним чином:

Запускаємо отриманий код в LaTeX і отримуємо таблицю:

Акуратно, чи не так? Це той самий вид таблиць, який ми звикли бачити в професійних журналах.

Якщо вам потрібні ще аргументи, то наступний факт точно переконає вас: в SPSS є одна річ, яку ви можете зробити з таблицой - це вставити її в текстовий документ. Як красиву картинку. В R кожна таблиця може бути визначена як окремий об'єкт, з якого можна витягати будь-яку інформацію. У вас є динамічний доступ до будь-якого і кожному числу всередині в будь-який час. Ну як?

Це те ж саме, що створити одну змінну на основі значень іншої змінної; і перекодування в ту ж змінну теж проста.

В іншу змінну Правити

Використовуючи індексування Правити

Порядок рівнів береться з черговості, в якій ми їх вказали (Рівень "Молодий" буде першим).

Тепер ми просто використовуємо міць індексації, закладеної в R.

Використовуючи функцію cut () Правити

Існує кілька способів досягти одного і того ж результату. Один з них - це використання функції cut (). Припустимо, у нас немає респондентів старше 100 років.

Результуюча змінна є фактором, значення рівнів якого зрозумілі інтуїтивно. Ми можемо оголосити порядок і значення рівнів явно:

Використовуючи функцію recode () Правити

Ще один спосіб зробити те ж саме, це використовувати функцію recode () з пакету car.

Зверніть увагу, що змінна, отримана в результаті, не є фактором (не всі символьні змінні мають тип "фактор"). Ми можемо використовувати аргумент as.factor.result функції recode (). але за замовчуванням це створить рівні, впорядковані за алфавітом, нам же більше сподобається, якщо рівень "Молодий" буде першим.

Традиційне рішення - це оголосити змінну впорядкованим фактором:

В ту ж змінну Правити

Тут важко додати щось нове. Просто з лівого і правого боку оператора присвоювання "<-" мы используем имя одной и той же переменной:

Єдина хитрість з'являється при індексуванні. Покажемо на прикладі:

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

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

Як зберігати в форматі R? правити

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

Тому питання: як зберігати що?

Оскільки R маніпулює великою кількістю об'єктів, тому й розуміє він багато форматів даних (включаючи .sav і .por файли).

Згідно з інформацією, отриманою за допомогою команди? Data. існує чотири підтримуваних формату даних з наступними розширеннями:

Але цей список не є обов'язковим до виконання. Можна назвати файл будь-яким ім'ям з будь-яким розширенням, тому що при читанні цього файлу буде необхідно вказати повне ім'я, включаючи розширення.

Зазвичай, файли, що містять код R (тобто послідовність команд для виконання), мають розширення ".R".

Ще одне важливе зауваження: так як R може працювати відразу з безліччю об'єктів в пам'яті одночасно (уявіть відразу два завантажених в пам'ять масиву даних SPSS), він так само дозволяє записувати неколько об'єктів в один файл.

У наступних прикладах я буду припускати, що читання і запис файлів ведеться в поточній директорії (для довідки див. Getwd і? Setwd).

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

dump () і source () Правити

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

Код R зазвичай записується файли з розширенням ".R", тому ми вибираючи таке ж розширення:

На наступному кроці ми можемо використовувати команди з файлу "test.R" з використанням функції source ():

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

save () і load () Правити

Цей спосіб збереження об'єктів R найбільш надійний, і саме його я рекомендую для застосування. В даному випадку інформація записується в двійковому форматі, і тому файли нечитабельним людиною.

Значна перевага функції save () - це маленький розмір одержуваних файлів. Вони можуть бути додатково стиснуті (або шляхом застосування аргументу "compress", або подальшого стискання утилітою gzip), і R без будь-яких проблем прочитає ці файли.

Синтакс функції дуже простий:

Перша відмінність від функції dump (). перший аргумент не укладено в лапки. Щоб зрозуміти, чому, зверніться до довідки по обидва функцій.

Читання даних проводиться просто:

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

dput () і dget () Правити

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

Тут ми використовували розширення імені файлу ".Rdput" (розширення може бути будь-яким). Дуже корисно використовувати аргумент control = "all". це дасть гарантію, що внутрішня структура об'єкта буде записана в файл повністю (включаючи всі атрибути об'єкта).

Прочитуємо дані з диска:

Ще одна відмінність від команди dump () - це явне створення об'єкта, коли в попередньому варіанті створення об'єкта відбувається через інструкції, записані в файл.

write.table () і read.table () Правити

Функція write.table () створює ASCII -представлення масиву даних, розширення імені вихідного файлу - ".tab", ".txt" або ".csv" в залежності від виду заданого роздільник (аргумент sep).

Вихідний файл втратить всю внутрішню структуру об'єкта, тобто по ньому ми не зможемо судити, чи є змінна фактором, або упорядкованим фактором і т.д.

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

Як правило, ці формату SPSS не мають назв рядків (подібно іменам змінних). R, зі свого боку, такі імена містить (ще одна причина віддати перевагу R), тому, якщо ви хочете отримати імена змінних, встановіть значення відповідного аргументу (header) в TRUE.

Фукнція read.table () одна з найкорисніших, вона має безліч аргументів. Мінімальна форма застосування наступна:

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

write () Правити

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

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

У випадку з матрицею, ми повинні транспонувати її перед тим, як записувати в файл:

Вихідний файл не містить імен рядків і стовпців.

.saveRDS () і .readRDS () Правити

Даний підхід рекомендується для сміливих користувачів.

Зверніть увагу на наявність точок на початку назви функцій.

Іноді виникає ситуація, коли необхідно зберегти об'єкти R в базі даних, подібних MySQL. Зазвичай це пов'язано з тим, що масив даних дуже великий.

Ця операція проста для масивів даних (dataframe) - вони мають структуру, подібну структурі баз даних. Для більш складних об'єктів, наприклад, списки або навіть матриці, таке пряме збереження просто неможливо.

R може перетворити будь-який свій об'єкт в двійкову форму, як в формат BLOB (великий бінарний об'єкт) або його ASCII-представлення. Це перетворення називається сериализацией і воно дає велику перевагу, тому що серіалізовані об'єкт - це ніщо інше, як простий вектор (як колонка в таблиці MySQL).

Щоб серіалізовать об'єкт, використовуйте функцію serialize (). щоб звернути серіалізовані об'єкт в нормальний стан, використовуйте unserialize ().

Функція .saveRDS () дозволяє зберегти серіалізовані об'єкт в поточній директорії. readRDS () зчитує його назад.

Ця команда збереже стислий ASCII-варіант серіалізовані об'єкта R. Якщо ж вас цікавить, як виглядає серіалізовані об'єкт, виконайте наступне:

Для більш детальної інформації про R російською мовою дивіться: