Основы работы в R

Олеся Волченко

2 сентября 2021

Что происходит?

Достоинства R

Недостатки R

Стадии изучения R

Установка R

В качестве языка НАСТОЯТЕЛЬНО рекомендую выбрать английский.

Установка Rstudio

Не могу установить R/RStudio

Работать в Rstudio cloud - https://rstudio.cloud/

Как начать?

Создание объекта

Присваивание / Assignment

x <- 5
x
## [1] 5
x <- x + 5

Функции

Функция в R имеет форму functionname(x,y,z)
где x, y и z - аргументы функции Например, функция sum()

sum(x = 10, y = 15)
## [1] 25
x1 <- sum(x = 10, y = 15)

R как калькулятор

2 + 2
## [1] 4
2 * 3
## [1] 6
2^3
## [1] 8
(100-25)/3
## [1] 25

Классы данных в R

Мы будем работать с векторами, факторами и Data frame

Векторы

a <- c(1, 2, 3)
a
## [1] 1 2 3
b <- rep(1, 10)
b
##  [1] 1 1 1 1 1 1 1 1 1 1
c <- seq(1, 5, 1)
c
## [1] 1 2 3 4 5
d <- 1:5
d
## [1] 1 2 3 4 5

А можно даже так:

e <- c(a, b, c, d)

Факторы

f <- factor(c("yes","no","yes","maybe","maybe","no","maybe","no","no"))
f
## [1] yes   no    yes   maybe maybe no    maybe no    no   
## Levels: maybe no yes
f1 <- factor(c("yes","no","yes","maybe","maybe","no","maybe","no","no"), 
             levels = c("no", "maybe", "yes"), ordered = T)
f1
## [1] yes   no    yes   maybe maybe no    maybe no    no   
## Levels: no < maybe < yes

Data frame

name <- c("Masha", "Vasya", "Anya", "Petya", "Vanya")
age <- c(18, 17, 19, 21, 20)
weight <- c(45, 80, 69, 92, 60)
height <- c(1.62, 1.75, 1.82, 1.92, 1.70)
gender <- c("F", "M", "F", "M", "M")
course <- c(1, 1, 2, 3, 4)
students <- data.frame(name, age, weight, height, gender, course)
students
##    name age weight height gender course
## 1 Masha  18     45   1.62      F      1
## 2 Vasya  17     80   1.75      M      1
## 3  Anya  19     69   1.82      F      2
## 4 Petya  21     92   1.92      M      3
## 5 Vanya  20     60   1.70      M      4

Вызов подобъектов

Переменная целиком (нужно знать название переменной)

students$gender
## [1] "F" "M" "F" "M" "M"

Значение из конкретной ячейки (в данном случае первая строка, первый столбец):

students[1, 1]
## [1] "Masha"

Первая строка целиком:

students[1, ]
##    name age weight height gender course
## 1 Masha  18     45   1.62      F      1

Первый столбец целиком:

students[ , 1]
## [1] "Masha" "Vasya" "Anya"  "Petya" "Vanya"

head() — выводим первые 6 строк базы данных
tail() — выводим последние 6 строк базы данных

Типы данных

Рабочая директория, рабочее пространство

Рабочая директория – папка, где R по умолчанию ищет и сохраняет файлы

getwd() # посмотреть, какая рабочая директория установлена
## [1] "/Users/olesyavolchenko/Yandex.Disk.localized/teaching/DA MA 2021/lec 1 intro to R"
setwd("C:/my dear R") # установить рабочую директорию
dir()

Желательно, чтобы директория не содержала в себе киррилических символов
C:/Desktop/Maша - вот так плохо
C:/Desktop/Masha - вот так хорошо

Немного советов при работе в R

Хочу работать с настоящими данными!

Общая схема работы с данными в R

Настоящий пример!

Загружаем данные

Проверяем, есть ли файл ESS5e03.sav в рабочей директории при помощи dir()

dir()
## [1] "basic_R_eng.html"                           
## [2] "garold.jpg"                                 
## [3] "lec1.html"                                  
## [4] "lec1.Rmd"                                   
## [5] "ropewalker.jpg"                             
## [6] "rsconnect"                                  
## [7] "screen1.png"                                
## [8] "str.png"                                    
## [9] "WVS_Wave_7_Russian_Federation_Spss_v1.4.sav"
library(foreign)
ESS <- read.spss("/Users/olesyavolchenko/Desktop/ESS5e03_4.sav", use.value.labels=T, to.data.frame=T)
dim(ESS)
## [1] 52458   674

Отбираем нужные переменные

#install.packages("dplyr") # Устанавливаем пакет dplyr
library(dplyr)
ESS1 <- select(ESS, c("eduyrs", "agea", "agertr", "gndr", 
             "icmnact", "facntr", "mocntr", "impfun"))

Если хотите узнать, что это за переменные - смотрите codebook https://www.europeansocialsurvey.org/docs/round5/survey/ESS5_appendix_a6_e01_0.pdf.

Посмотрим на загруженную базу данных

dim(ESS1) # количество строк и столбцов
## [1] 52458     8
head(ESS1) # первые 6 строк
##   eduyrs agea agertr   gndr      icmnact facntr mocntr           impfun
## 1     15   22   <NA>   Male   All others     No     No Somewhat like me
## 2     15   43   <NA>   Male In paid work     No     No          Like me
## 3     13   19   <NA> Female   All others    Yes    Yes          Like me
## 4     15   23   <NA> Female In paid work    Yes     No Somewhat like me
## 5     15   58     60 Female   All others    Yes    Yes          Like me
## 6     13   62     60 Female      Retired    Yes    Yes      Not like me
tail(ESS1) # последние 6 строк
##       eduyrs agea agertr   gndr      icmnact facntr mocntr             impfun
## 52453     16   65     50 Female   All others    Yes    Yes   Somewhat like me
## 52454     11   72     60   Male      Retired    Yes    Yes   A little like me
## 52455     10   57     55 Female   All others    Yes    Yes        Not like me
## 52456     14   44     45 Female         <NA>     No    Yes   Somewhat like me
## 52457      9   23   <NA>   Male In paid work    Yes    Yes   Somewhat like me
## 52458      8   72   <NA> Female      Retired    Yes    Yes Not like me at all
names(ESS1) # названия переменных
## [1] "eduyrs"  "agea"    "agertr"  "gndr"    "icmnact" "facntr"  "mocntr" 
## [8] "impfun"
dplyr::glimpse(ESS1) # тип каждой из переменных и первые несколько наблюдений
## Rows: 52,458
## Columns: 8
## $ eduyrs  <fct> 15, 15, 13, 15, 15, 13, 17, 13, 12, 12, 12, 7, 12, 10, 11, 14…
## $ agea    <fct> 22, 43, 19, 23, 58, 62, 26, 40, 48, 68, 72, 70, 56, 63, 16, 5…
## $ agertr  <fct> NA, NA, NA, NA, 60, 60, NA, NA, 58, 61, 59, 60, 60, 55, NA, 6…
## $ gndr    <fct> Male, Male, Female, Female, Female, Female, Male, Male, Male,…
## $ icmnact <fct> All others, In paid work, All others, In paid work, All other…
## $ facntr  <fct> No, No, Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes…
## $ mocntr  <fct> No, No, Yes, No, Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes,…
## $ impfun  <fct> Somewhat like me, Like me, Like me, Somewhat like me, Like me…
str(ESS1) # тип каждой из переменных 
## 'data.frame':    52458 obs. of  8 variables:
##  $ eduyrs : Factor w/ 45 levels "0","1","2","3",..: 16 16 14 16 16 14 18 14 13 13 ...
##  $ agea   : Factor w/ 88 levels "14","15","16",..: 9 30 6 10 45 49 13 27 35 55 ...
##  $ agertr : Factor w/ 77 levels "0","1","2","5",..: NA NA NA NA 45 45 NA NA 43 46 ...
##  $ gndr   : Factor w/ 2 levels "Male","Female": 1 1 2 2 2 2 1 1 1 1 ...
##  $ icmnact: Factor w/ 3 levels "In paid work",..: 3 1 3 1 3 2 1 1 1 2 ...
##  $ facntr : Factor w/ 2 levels "Yes","No": 2 2 1 1 1 1 1 1 1 1 ...
##  $ mocntr : Factor w/ 2 levels "Yes","No": 2 2 1 2 1 1 1 1 1 1 ...
##  $ impfun : Factor w/ 6 levels "Very much like me",..: 3 2 2 3 2 5 2 2 2 2 ...

Подготовка переменных к работе - что нужно?

Перекодируем переменную

Поработаем с переменной “количество лет образования”

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

class(ESS1$eduyrs)
## [1] "factor"
ESS1$eduyrs <- as.numeric(as.character(ESS1$eduyrs)) #меняем тип переменной, чтобы с ней можно было выполнять математические действия
ESS1$eduyrs3[ESS1$eduyrs <= 10] <- "<11" 
ESS1$eduyrs3[ESS1$eduyrs > 10 & ESS1$eduyrs <= 16] <- "11-16" 
ESS1$eduyrs3[ESS1$eduyrs > 16] <- "17+" 
summary(ESS1$eduyrs3)
##    Length     Class      Mode 
##     52458 character character
summary(as.factor(ESS1$eduyrs3))
##   <11 11-16   17+  NA's 
## 14776 29772  7281   629
barplot(table(ESS1$eduyrs3))

Перекодируем переменную - 2

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

impfun - Important to seek fun and things that give pleasure

summary(ESS1$impfun)
##  Very much like me            Like me   Somewhat like me   A little like me 
##               6303              13650              12619               9198 
##        Not like me Not like me at all               NA's 
##               6570               2791               1327
table(ESS1$impfun)
## 
##  Very much like me            Like me   Somewhat like me   A little like me 
##               6303              13650              12619               9198 
##        Not like me Not like me at all 
##               6570               2791
ESS1$impfun3 <- dplyr::recode(ESS1$impfun, "Very much like me" = 3,
"Like me" = 3, "Somewhat like me" = 2, "A little like me" = 2, "Not like me" = 1, 
"Not like me at all" = 1)
table(ESS1$impfun3)
## 
##     1     2     3 
##  9361 21817 19953
table(ESS1$impfun3, ESS1$impfun) # делаем кросс-таблицу чтобы проверить правильность перекодировки
##    
##     Very much like me Like me Somewhat like me A little like me Not like me
##   1                 0       0                0                0        6570
##   2                 0       0            12619             9198           0
##   3              6303   13650                0                0           0
##    
##     Not like me at all
##   1               2791
##   2                  0
##   3                  0

Перекодируем переменную - 2

Визуализируем распределение новой переменной

barplot(table(ESS1$impfun3))

Рассчитать индекс

разница между возрастом респондента и идеальным возрастом выхода на пенсию по его/ее мнению

ESS1$agertr <- as.numeric(as.character(ESS1$agertr))
ESS1$agea <- as.numeric(as.character(ESS1$agea))
ESS1$diff <- ESS1$agertr - ESS1$agea

Визуализируем распределение новой переменной (гистограмма)

hist(ESS1$diff)

Создадим новую переменную: мигрант второго поколения

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

переменные: facntr - Father born in [country]
mocntr - Mother born in [country]

levels(ESS1$facntr)
## [1] "Yes" "No"
levels(ESS1$mocntr)
## [1] "Yes" "No"
ESS1$mig2 <- ifelse(ESS1$mocntr=="No" | ESS1$facntr=="No", "Yes", "No")

Решим маленькую исследовательскую задачу

Интересно, как для работающих людей связаны возраст и идеальный (по их мнению) возраст выхода на пенсию?
Что нужно?

Создадим подвыборку

Отберем только тех респондентов, которые работают на оплачиваемой работе

unique(ESS1$icmnact)
## [1] All others   In paid work Retired      <NA>        
## Levels: In paid work Retired All others
summary(ESS1$icmnact)
## In paid work      Retired   All others         NA's 
##        24049        14055        14220          134
ESS1sub <- subset(ESS1, subset=(icmnact=="In paid work"))
dim(ESS1sub)
## [1] 24049    12

Посмотрим на переменные “agertr” и “age”

summary(ESS1sub$agertr)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    5.00   58.00   60.00   60.49   63.00  120.00   14918
summary(ESS1sub$agea)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   15.00   33.00   43.00   42.59   52.00   88.00      71

Строим график

plot(ESS1sub$agea, ESS1sub$agertr)

Boxplot

Отличается ли медианный возраст планируемого выхода на пенсию для женщин и мужчин?

boxplot(ESS1sub$agertr ~ ESS1sub$gndr)

Обзор полезных функций

Частые ошибки начинающих

Что нужно научиться делать как можно быстрее?

  1. Загружать базы данных различных типов
  2. Перекодировать переменные
  3. Делать подвыборку
  4. Отобрать нужные переменные
  5. Получать базовые описательные статистики
  6. Cтроить базовые графики

Как выжить?

Домашнее задание

Удачи!