Уважаемые студенты!

Мы с вами начинаем обозревать передовой метод обработки данных, который используется ведущими исследователями — язык R. В условиях, когда MS Excel уже давно устарел для обработки данных как единственный метод, SPSS Statistics используют все, но нелегально, и купить ее в РФ нельзя, а JASP и jamovi часто дают ограниченный функционал (а еще и написаны на R) — знание этого языка программирования делает вас более подкованным в вопросах статистики, расширяет ваше резюме для работодателя и позволяет более гибко подходить к образовательной траектории. Недаром очень много психологов в наши дни становятся аналитиками данных.

R широко используется психологами, медиками, биоинформатиками, экологами. Всем, кому нужна статистика.

Вы скажете: а что Python? Дело в том, что этот язык мультипрофильный, а R изначально создавался для нужд статистиков. Да, Python хорош для многого, но в статистике R проще.

Основные термины

Чанк (chunk) — логически завершенный элемент кода
Датасет (dataset) — файл с данными. Сет данных, data set. Используется широко вне R
Оверкодинг (overcoding) — написание кода большим количеством строк и функций, чем это возможно; отсутствие возможности упростить код там, где это можно сделать
Библиотека — набор функций, выполняющих определенные задачи, которые нам нужны (readxl — библиотека, read_xlsx — функция)
Функция — конкретная задача, которая нам нужна (read_xlsx внутри readxl)

1. Документация

Если вы видите функцию или библиотеку — вообще что угодно – в первый раз, или просто хотите себе напомнить, как это работает — напишите ?, а потом название без пробела и запустите. Информация откроется во вкладке Help или в новой странице браузера.

?array

Бывает такое, что это не помогает. Например, как здесь:

?psych
## В указанных пакетах и библиотеках нет документации для 'psych':
## можете попробовать '??psych'

Не беда! Попробуйте поставить два вопросительных знака:

??psych
Иногда R не знает, что вам ответить, потому что у вас не установлена библиотека, а через два вопросительных знака запрос выдает чепуху. Об этом будет сказано ниже.

Попробуйте сами:

?mutate
## В указанных пакетах и библиотеках нет документации для 'mutate':
## можете попробовать '??mutate'
??mutate

2. Установка библиотек

Для многих необходимых нам приблуд нам понадобятся соответствующие библиотеки. Их надо скачивать. Далеко не все эти библиотеки предустановлены в базовом R. Кроме того, чтобы ваш код был воспроизводимым, необходимо прописывать установку библиотек в случае, если на компьютере, где он будет воспроизводиться, нужной библиотеки не окажется. Тогда код не запустится, даже если он запускается у вас. Если вы работаете на компанию, это может быть грустно. Или если сдаете зачет по Методам математической статистики преподавателю… just saying.

№1. Базовый

install.packages("tidyverse") 
## пакет 'tidyverse' успешно распакован, MD5-суммы проверены
## 
## Скачанные бинарные пакеты находятся в
##  C:\Users\kitsu\AppData\Local\Temp\RtmpsHU9Fy\downloaded_packages

Функция install.packages отлично с этим справляется.

Но что нужно сделать, если библиотек несколько? А их почти всегда несколько…

№2. Для 2+ библиотек

Такая установка будет работать:

install.packages("tidyverse")
## пакет 'tidyverse' успешно распакован, MD5-суммы проверены
## 
## Скачанные бинарные пакеты находятся в
##  C:\Users\kitsu\AppData\Local\Temp\RtmpsHU9Fy\downloaded_packages
install.packages("psych")
## пакет 'psych' успешно распакован, MD5-суммы проверены
## 
## Скачанные бинарные пакеты находятся в
##  C:\Users\kitsu\AppData\Local\Temp\RtmpsHU9Fy\downloaded_packages

Но меньше места будет занимать вот этот вариант:

install.packages(c("tidyverse","psych")) 
## пакет 'tidyverse' успешно распакован, MD5-суммы проверены
## пакет 'psych' успешно распакован, MD5-суммы проверены
## 
## Скачанные бинарные пакеты находятся в
##  C:\Users\kitsu\AppData\Local\Temp\RtmpsHU9Fy\downloaded_packages

Функция c() — это вектор. В него можно положить столько библиотек, сколько вам надо. А надо обычно несколько. Все библиотеки я буду сообщать вам для каждого ПЗ. Так можно составить свой вектор-список необходимых библиотек и устанавливать их каждый раз.

№3. Для продвинутых

Существует библиотека, которая позволяет загружать столько библиотек, сколько хотите. Тоже вариант.

install.packages("pacman") 
## пакет 'pacman' успешно распакован, MD5-суммы проверены
## 
## Скачанные бинарные пакеты находятся в
##  C:\Users\kitsu\AppData\Local\Temp\RtmpsHU9Fy\downloaded_packages
pacman::p_load(tidyverse, psych) 

Когда их устанавливать?

На ваш компьютер с рабочим RStudio — всего один раз. Они будут установлены, даже когда вы выйдете из программы.

Но вы никогда не знаете, к кому попадет в руки ваш код. Прописать лишнюю строчку кода будет спокойнее.

3. Запуск библиотек

Собственно говоря, одной установки недостаточно. R нужно открыть эту библиотеку, запустить ее. Важно, что все библиотеки выключаются, когда вы закрываете R. Поэтому этот чанк обязателен всегда — иначе вы сами не запустите свой код, не говоря уже обо мне или ваших коллегах на работе. Нельзя играть в игру, не запустив ее, а только установив. Здесь та же логика.

№1. Запуск одной библиотеки

library(tidyverse) 

Готово. Можно пользоваться ее функциями.

Функция mutate — часть библиотеки dplyr, которая устанавливается, когда мы устанавливаем tidyverse. Предпоследний столбец справа, самая верхняя библиотека — видите? Запустив библиотеку, R поймет, что это и покажет вам нужную информацию.

Попробуйте сами:

install.packages("tidyverse") 
library(tidyverse)
?mutate

№2. Запуск 2+ библиотек

Можно наоверкодить и писать каждую библиотеку отдельной строчкой. Не запрещается:

library(tidyverse) 
library(psych) 

Но так намного проще:

lapply(c("tidyverse", "psych"), library, character.only = TRUE)
## [[1]]
##  [1] "psych"     "lubridate" "forcats"   "stringr"   "dplyr"     "purrr"    
##  [7] "readr"     "tidyr"     "tibble"    "ggplot2"   "tidyverse" "stats"    
## [13] "graphics"  "grDevices" "utils"     "datasets"  "methods"   "base"     
## 
## [[2]]
##  [1] "psych"     "lubridate" "forcats"   "stringr"   "dplyr"     "purrr"    
##  [7] "readr"     "tidyr"     "tibble"    "ggplot2"   "tidyverse" "stats"    
## [13] "graphics"  "grDevices" "utils"     "datasets"  "methods"   "base"

Кстати, между кодом выше и кодом ниже нет никакой разницы. Любые блоки, отделенные запятой, любые функции — можно отбивать клавишей Enter. Это нужно для того, чтобы вы видели каждую запятую и скобочку и лучше контролировали, что ничего не пропустили. Для коротких строк кода можно так не делать, но далее вы убедитесь, что так удобно.

lapply(
  c(
    "tidyverse", 
    "psych"
   ), 
  library, 
  character.only = TRUE
  )
## [[1]]
##  [1] "psych"     "lubridate" "forcats"   "stringr"   "dplyr"     "purrr"    
##  [7] "readr"     "tidyr"     "tibble"    "ggplot2"   "tidyverse" "stats"    
## [13] "graphics"  "grDevices" "utils"     "datasets"  "methods"   "base"     
## 
## [[2]]
##  [1] "psych"     "lubridate" "forcats"   "stringr"   "dplyr"     "purrr"    
##  [7] "readr"     "tidyr"     "tibble"    "ggplot2"   "tidyverse" "stats"    
## [13] "graphics"  "grDevices" "utils"     "datasets"  "methods"   "base"

Когда их запускать?

Запускать их надо однократно в коде. Один раз запустили — все функции этой библиотеки будут работать.

Старайтесь запускать их в начале кода, если вы точно знаете, что они вам понадобятся. Чаще всего, поскольку я буду сопровождать свои задания нужными библиотеками, вы будете это знать. Главное: сначала установить, потом запустить.

Но можно и в середине кода — это не страшно.

Можно вообще ссылаться на библиотеку через :: перед функцией. Так она автоматом включится. Но это удобно, если она вам нужна однократно. Внимательные читатели уже заметили этот пример:

install.packages("pacman") 
## пакет 'pacman' успешно распакован, MD5-суммы проверены
## 
## Скачанные бинарные пакеты находятся в
##  C:\Users\kitsu\AppData\Local\Temp\RtmpsHU9Fy\downloaded_packages
pacman::p_load(tidyverse, psych) 

Библиотеки мы загружаем однократно, поэтому это уместно.

Если же весь ваш код будет построен на функциях двух-трех библиотек, намного проще один раз запустить library() или lapply() как в примерах выше.

4. Запуск датасета

Итак, чем считать — мы включили, а что считать — еще нет.

Чаще всего наши файлы будут в формате .xlsx. Так выгружают практически все агрегаторы ответов. Для чтения таких файлов запускаем библиотеку readxl, она уже установлена.

library(readxl)

№1. Прямой путь файла (плохо)

Всегда можно зайти во вкладку Environment => Import Dataset => From Excel и выбрать свой файл. Но все равно, когда вы так сделаете, код ниже пропишется за вас:

library(readxl) # уже есть в базовом R, скачивать ее не надо
dataset <- read_excel("C:/Users/kitsu/OneDrive/! ФИНАШКА/!! Методы математической статистики в психологических исследованиях/dataset.xlsx")
View(dataset)

Но это ОЧЕНЬ плохой подход. Почему? Потому что как только вы переименовали файл, любую папку в директории на пути к файлу, просто перенесли файл - вы его потеряли. Надо прописывать путь заново.

К тому же, у вас вряд ли есть MS OneDrive, ваше имя пользователя вряд ли kitsu, вряд ли есть у вас папка ! ФИНАШКА (да, Финуниверситет писать длинно!) и подпапка !! Методы математической статистики в психологических исследованиях. Верно?

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

К тому же, у каждого человека разный вкус в плане диска для хранения, директорий и их названия. Можете не надеяться, что у меня или коллеги в компании завалялся точно такой же путь. Соответственно, код не запустится, потому что не присоединится датасет.

Кстати, хранить файлы датасета в облаке (любом) и потом присоединять их к R — еще хуже. Облако всегда изменяется, может залагать. Без интернета поработать над кодом труднее. Не будьте, как я.

№2. Рабочая директория (хорошо)

Узнайте, какая директория у R рабочая:

getwd()
## [1] "C:/Users/kitsu/OneDrive/! ФИНАШКА/!! Методы математической статистики в психологических исследованиях/RMarkdown"

Обычно это Мои документы или Документы, если у вас Windows 10 или 11.

Смените директорию на удобную вам, если это необходимо. У меня это будет такой вот длинный путь. Всегда можно поставить Рабочий стол или Мои документы, если работаете с личного ПК. Если вы работаете с ПК Финуниверситета, задайте в директории вашу личную папку и кладите все нужные вам датасеты туда.

Тогда вы можете один раз в начале кода прописать нужную вам директорию (или даже не прописывать, если вам ок с папкой Документы):

setwd("C:/Users/kitsu/OneDrive/! ФИНАШКА/!! Методы математической статистики в психологических исследованиях/RMarkdown")

А потом флексить:

dataset <- read_excel("dataset.xlsx")

Намного короче и лаконичнее, м? Я или ваш коллега в компании, смотря ваш код, загрузим датасет к себе в свою рабочую директорию, и R найдет ее там по имени и запустит. Удобно.

Что значит dataset <- ?

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

Пример вы уже видели выше:

View(dataset)

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

Обычно для базового датасета, к которому еще не применялись никакие вычислительные действия или предобработка, пишут df (от слова dataframe — датафрейм). Можно ds, как угодно. Стараемся не называть это именами существующих функций, например, View, так R запутается. Dataset — тоже ок. Главное, чтобы не skagnvkdbnvpqdbje.

Для файлов SPSS (.sav) библиотека будет haven, а функция — read_sav.

5. Комментарии внутри файла

Крайне желательно пояснять каждую строчку кода. Это нужно:

  • для вас самих: чтобы вы не забыли, зачем это сделали;
  • тоже для вас самих: понимаете, что делаете не так;
  • для меня: так я контролирую выполнение вами задачи;
  • для коллег по работе: так они понимают, как вы добились такого результата
  • для любых внешних наблюдателей: ваши комментарии расширяют понимание кода, особенно, если там есть вариации

Для этого перед текстом в коде ставится минимум одна решетка.

#вот так работает

# вот так работает

## и вот так работает

########## а если поставите много решеток, то отдельные чанки можно сворачивать
# типа как подзаголовки, это очень удобно

Выводы

  • Любой ваш код должен начинаться с плюс-минус следующих строк:

  • Устанавливаем пакеты на свой ПК единожды, а вот библиотеки запускаем каждый раз, как открываем R.

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

  • Не забываем ставить комментарии.

  • Если что-то непонятно — всегда есть ? или ??