Продолжаем работать с базой данных нашего эксперимента.
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
Видим, что разброс значений относительно среднего у девушек выше, чем у юношей.