Уважаемые студенты!
Мы с вами начинаем обозревать передовой метод обработки данных, который используется ведущими исследователями — язык 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) |
Если вы видите функцию или библиотеку — вообще что угодно – в первый раз, или просто хотите себе напомнить, как это работает — напишите ?, а потом название без пробела и запустите. Информация откроется во вкладке Help или в новой странице браузера.
?array
Бывает такое, что это не помогает. Например, как здесь:
?psych
## В указанных пакетах и библиотеках нет документации для 'psych':
## можете попробовать '??psych'
Не беда! Попробуйте поставить два вопросительных знака:
??psych
| Иногда R не знает, что вам ответить, потому что у вас не установлена библиотека, а через два вопросительных знака запрос выдает чепуху. Об этом будет сказано ниже. |
Попробуйте сами:
?mutate
## В указанных пакетах и библиотеках нет документации для 'mutate':
## можете попробовать '??mutate'
??mutate
Для многих необходимых нам приблуд нам понадобятся соответствующие библиотеки. Их надо скачивать. Далеко не все эти библиотеки предустановлены в базовом R. Кроме того, чтобы ваш код был воспроизводимым, необходимо прописывать установку библиотек в случае, если на компьютере, где он будет воспроизводиться, нужной библиотеки не окажется. Тогда код не запустится, даже если он запускается у вас. Если вы работаете на компанию, это может быть грустно. Или если сдаете зачет по Методам математической статистики преподавателю… just saying.
install.packages("tidyverse")
## пакет 'tidyverse' успешно распакован, MD5-суммы проверены
##
## Скачанные бинарные пакеты находятся в
## C:\Users\kitsu\AppData\Local\Temp\RtmpsHU9Fy\downloaded_packages
Функция install.packages отлично с этим справляется.
Но что нужно сделать, если библиотек несколько? А их почти всегда несколько…
Такая установка будет работать:
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() — это вектор. В него можно положить столько библиотек, сколько вам надо. А надо обычно несколько. Все библиотеки я буду сообщать вам для каждого ПЗ. Так можно составить свой вектор-список необходимых библиотек и устанавливать их каждый раз.
Существует библиотека, которая позволяет загружать столько библиотек, сколько хотите. Тоже вариант.
install.packages("pacman")
## пакет 'pacman' успешно распакован, MD5-суммы проверены
##
## Скачанные бинарные пакеты находятся в
## C:\Users\kitsu\AppData\Local\Temp\RtmpsHU9Fy\downloaded_packages
pacman::p_load(tidyverse, psych)
На ваш компьютер с рабочим RStudio — всего один раз. Они будут установлены, даже когда вы выйдете из программы.
Но вы никогда не знаете, к кому попадет в руки ваш код. Прописать лишнюю строчку кода будет спокойнее.
Собственно говоря, одной установки недостаточно. R нужно открыть эту библиотеку, запустить ее. Важно, что все библиотеки выключаются, когда вы закрываете R. Поэтому этот чанк обязателен всегда — иначе вы сами не запустите свой код, не говоря уже обо мне или ваших коллегах на работе. Нельзя играть в игру, не запустив ее, а только установив. Здесь та же логика.
library(tidyverse)
Готово. Можно пользоваться ее функциями.
| Функция mutate — часть библиотеки dplyr, которая устанавливается, когда мы устанавливаем tidyverse. Предпоследний столбец справа, самая верхняя библиотека — видите? Запустив библиотеку, R поймет, что это и покажет вам нужную информацию. |
Попробуйте сами:
install.packages("tidyverse")
library(tidyverse)
?mutate
Можно наоверкодить и писать каждую библиотеку отдельной строчкой. Не запрещается:
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() как в примерах выше.
Итак, чем считать — мы включили, а что считать — еще нет.
Чаще всего наши файлы будут в формате .xlsx. Так выгружают практически все агрегаторы ответов. Для чтения таких файлов запускаем библиотеку readxl, она уже установлена.
library(readxl)
Всегда можно зайти во вкладку Environment => Import Dataset => From Excel и выбрать свой файл. Но все равно, когда вы так сделаете, код ниже пропишется за вас:
library(readxl) # уже есть в базовом R, скачивать ее не надо
dataset <- read_excel("C:/Users/kitsu/OneDrive/! ФИНАШКА/!! Методы математической статистики в психологических исследованиях/dataset.xlsx")
View(dataset)
Но это ОЧЕНЬ плохой подход. Почему? Потому что как только вы переименовали файл, любую папку в директории на пути к файлу, просто перенесли файл - вы его потеряли. Надо прописывать путь заново.
К тому же, у вас вряд ли есть MS OneDrive, ваше имя пользователя вряд ли kitsu, вряд ли есть у вас папка ! ФИНАШКА (да, Финуниверситет писать длинно!) и подпапка !! Методы математической статистики в психологических исследованиях. Верно?
И создавать себе такую папку, лишь бы не трогать прямой путь в директории, прописанный однократно - ужасный гемор.
К тому же, у каждого человека разный вкус в плане диска для хранения, директорий и их названия. Можете не надеяться, что у меня или коллеги в компании завалялся точно такой же путь. Соответственно, код не запустится, потому что не присоединится датасет.
Кстати, хранить файлы датасета в облаке (любом) и потом присоединять их к R — еще хуже. Облако всегда изменяется, может залагать. Без интернета поработать над кодом труднее. Не будьте, как я.
Узнайте, какая директория у R рабочая:
getwd()
## [1] "C:/Users/kitsu/OneDrive/! ФИНАШКА/!! Методы математической статистики в психологических исследованиях/RMarkdown"
Обычно это Мои документы или Документы, если у вас Windows 10 или 11.
Смените директорию на удобную вам, если это необходимо. У меня это будет такой вот длинный путь. Всегда можно поставить Рабочий стол или Мои документы, если работаете с личного ПК. Если вы работаете с ПК Финуниверситета, задайте в директории вашу личную папку и кладите все нужные вам датасеты туда.
Тогда вы можете один раз в начале кода прописать нужную вам директорию (или даже не прописывать, если вам ок с папкой Документы):
setwd("C:/Users/kitsu/OneDrive/! ФИНАШКА/!! Методы математической статистики в психологических исследованиях/RMarkdown")
А потом флексить:
dataset <- read_excel("dataset.xlsx")
Намного короче и лаконичнее, м? Я или ваш коллега в компании, смотря ваш код, загрузим датасет к себе в свою рабочую директорию, и R найдет ее там по имени и запустит. Удобно.
Это значит, что мы присваиваем этому датасету название и можем использовать его в своих манипуляциях, ссылаясь к нему по названию. Например, заключать в скобки какой-то функции, чтобы она запустилась.
Пример вы уже видели выше:
View(dataset)
Можно ли назвать датасет или датафрейм по типу skagnvkdbnvpqdbje или pussydestroyer777? Да, можно, если вы работаете с кодом одни. Но вы сильно пожалеете: каждый раз это длинное название нужно будет копировать и вставлять, либо вводить от руки. Да и необходимо соблюдать культуру, если ваш код будет смотреть коллега по работе. Или, например, преподаватель…
Обычно для базового датасета, к которому еще не применялись никакие вычислительные действия или предобработка, пишут df (от слова dataframe — датафрейм). Можно ds, как угодно. Стараемся не называть это именами существующих функций, например, View, так R запутается. Dataset — тоже ок. Главное, чтобы не skagnvkdbnvpqdbje.
Для файлов SPSS (.sav) библиотека будет haven, а функция — read_sav. |
Крайне желательно пояснять каждую строчку кода. Это нужно:
Для этого перед текстом в коде ставится минимум одна решетка.
#вот так работает
# вот так работает
## и вот так работает
########## а если поставите много решеток, то отдельные чанки можно сворачивать
# типа как подзаголовки, это очень удобно
Любой ваш код должен начинаться с плюс-минус следующих строк:
Устанавливаем пакеты на свой ПК единожды, а вот библиотеки запускаем каждый раз, как открываем R.
Проверяем свою рабочую директорию, чтобы подключаться к датасету быстро, удобно и с коротким кодом.
Не забываем ставить комментарии.
Если что-то непонятно — всегда есть ? или ??