Семинар

Продолжаем работать с базой данных нашего эксперимента.

df <- read.csv2("http://math-info.hse.ru/f/2018-19/psych-ms/data/psych_survey.csv")

Квадратные скобки и знак доллара

В R существует несколько способов обращаться к элементам внутри какого-то объекта. Во-первых, мы можем использовать квадратные скобки: они позволяют обратиться к элементу на основании его номера. Мы уже встречались с квадратными скобками, когда вызывали элементы вектора. Их можно использовать и для таблиц, только теперь внутри скобок должны стоять два числа через запятую. Первое число – номер строк, второе – номер колонки. Если вы хотите выбрать все строчки или все колонки, то соответствующее место до или после запятой надо оставить пустым.

Выберем с 1 по 5 строчки и 1 и 2 колонки:

df[1:5,1:2]
##   height math
## 1    169   76
## 2    168   62
## 3    164   80
## 4    158   75
## 5    186   62

Теперь выберем только 1 и 5 строчки и 1 и 2 колонки:

df[c(1,5),1:2]
##   height math
## 1    169   76
## 5    186   62

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

?"["

Чтобы обращаться к элементам объекта на основании их названий, используется знак доллара. В таблицах доллар позволяет выбирать колонки по их названию. Например:

df$math
##   [1] 76 62 80 75 62 70 NA 79 50 70 NA 50 85 72 91 76 68 NA 72 68 74 80 99
##  [24] 78 75 86 78 80 76 84 70 NA 78 NA 80 86 72 86 78 86 NA 72 94 78 97 72
##  [47] 68 80 80 61 76 NA 74 78 56 78 76 80 62 84 NA 76 72 59 70 NA NA 74 74
##  [70] NA 74 68 56 NA NA 74 72 82 NA 74 NA 67 76 NA 65 70 72 70 50 72 72 70
##  [93] NA 70 70 50 74 80 76 78 82 88 62 50 62 76 62 86 72 74 70 82 72 84 59
## [116] 72 72 70 70 56 77 74 74

Факторы

Факторы – это тип переменных, которые несут качественную информацию, но закодированы числами. Мы можем сказать R, что с такими переменными не стоит проводить арифметических операций. Для этого нужно закодировать переменную как фактор.

В нашей таблице есть переменная, содержащая ответы респондентов на вопрос об их любимом предмете в школе. Посмотрим на распределение ответов по категориям:

table(df$subject)
## 
##  1  2  3  4  5 
## 29 37 18 18 19

Чтобы преобразовать переменную в фактор, используется функция factor(). У нее три аргумента: сначала нужно прописать, какую переменную мы преобразовываем; аргумент levels, уровни фактора, просит перечисление всех числовых значений переменной; аргумент labels задает текстовые метки для каждого числового значения в том порядке, в котором вы прописали уровни. Как уровни, так и лейблы нужно прописывать в виде вектора.

df$subject <- factor(df$subject,
                    levels = c(1,2,3,4,5), 
                    labels = c("math", "biology", "russian", "foreign", "neither"))

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

table(df$subject)
## 
##    math biology russian foreign neither 
##      29      37      18      18      19

Обратите внимание, что при отборе наблюдений на основании факторов, Вам нужно будет указывать не уровни фактора, а соответствующие лейблы.

Пропущенные значения

Функция is.na() позволяет проверить, встречаются ли в переменной пропущенные значения. Если мы выполним ее, нам вернется вектор из логических значений, где значение TRUE будет означать, что для наблюдения значение переменной пропущено.

is.na(df$gender)
##   [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [23]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [34] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [45] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [56] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [67] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [78] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [89] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [100] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [111] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [122] FALSE FALSE

Мы можем посмотреть, какие строчки содержат пропущенные значения по этой переменной:

subset(df, is.na(gender) == T)
##    height math bio subject gender residence length angle soft
## 23    145   99 100 foreign   <NA>         1     25    20    R
## 57    163   76  NA    math   <NA>         1     23    25    R
## 81    164   NA  NA neither   <NA>         1     30    30    R

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

subset(df, is.na(gender) == F)

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

sum(complete.cases(df))
## [1] 94

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

df_without_na <- na.omit(df)

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

Описательные статистики

Функция summary() позволяет считать описательные статистики (без характеристик изменчивости) для всей базы сразу или только для одной переменной. Для факторных переменных функция выведет распределение ответов по категориям:

summary(df)
##      height           math            bio           subject      gender  
##  Min.   :145.0   Min.   :50.00   Min.   : 60.0   math   :29   female:97  
##  1st Qu.:163.5   1st Qu.:70.00   1st Qu.: 72.0   biology:37   male  :23  
##  Median :169.0   Median :74.00   Median : 79.0   russian:18   NA's  : 3  
##  Mean   :169.0   Mean   :73.31   Mean   : 80.1   foreign:18              
##  3rd Qu.:174.5   3rd Qu.:78.00   3rd Qu.: 89.0   neither:19              
##  Max.   :190.0   Max.   :99.00   Max.   :100.0   NA's   : 2              
##                  NA's   :17      NA's   :22                              
##    residence         length         angle         soft   
##  Min.   :1.000   Min.   : 0.0   Min.   : 0.00   R   :93  
##  1st Qu.:1.000   1st Qu.:20.0   1st Qu.:21.00   SPSS:30  
##  Median :1.000   Median :25.0   Median :25.00            
##  Mean   :1.463   Mean   :23.9   Mean   :26.42            
##  3rd Qu.:2.000   3rd Qu.:27.0   3rd Qu.:30.00            
##  Max.   :3.000   Max.   :50.0   Max.   :60.00            
##  NA's   :2       NA's   :1

Выведем описательные статистики для переменной балла ЕГЭ по биологии:

summary(df$bio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    60.0    72.0    79.0    80.1    89.0   100.0      22

Можно посчитать отдельно те или иные характеристики. Например, можно посчитать математическое ожидание. Обратите внимание, что если в переменной содержатся пропущенные значения, то R не сможет выполнить расчеты. Ему нужно будет указать, что пропущенные наблюдения следует игнорировать, с помощью аргумента na.rm = TRUE:

mean(df$math)
## [1] NA
mean(df$math, na.rm = TRUE)
## [1] 73.31132

Давате попробуем посчитать среднее значение балла ЕГЭ по математике отдельно для девушек и для юношей. Для этого создадим две новых таблицы, куда отберем только девушек и только юношей.

female <- subset(df, gender == "female")
male <- subset(df, gender == "male")

Затем рассчитаем средние, обращаясь к переменной math в новых отдельных таблицах.

mean(female$math, na.rm = TRUE)
## [1] 73.06024
mean(male$math, na.rm = TRUE)
## [1] 72.95238

Мы видим, что различие в средних баллах ЕГЭ по математике у девушек и у юношей очень мало.

С помощью отдельных функций мы также можем рассчитать стандартные отклонения для переменных, которые не выводятся в выдаче функции summary():

sd(df$math, na.rm = TRUE)
## [1] 9.595002

Стандартное отклонение для балла ЕГЭ по математике среди всех студентов составляет 9.6 баллов.

sd(female$math, na.rm = TRUE)
## [1] 9.583204
sd(male$math, na.rm = TRUE)
## [1] 8.54679

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