Загрузите в R файл с данными результатов нашего игрового опроса.
df <- read.csv2("http://math-info.hse.ru/f/2018-19/psych-ms/data/psych_survey.csv")
Отсортируйте базу данных по убыванию по переменной балла ЕГЭ по математике.
Выведите на экран на 5 верхних и 5 нижних строчек отсортированной базы.
Создайте переменную отклонения оценки величины угла от истинного значения angle_diff, если известно, что величина угла составляла 18 градусов.
Выведите описательные статистики для студентов, изучающих R.
Рассчитайте среднее значение балла ЕГЭ по математике для студентов, указавших математику в качестве любимого предмета, и для тех, кто ее таковым не назвал.
Отсортируем базу по переменной балла ЕГЭ по математике в порядке убывания и выведем верхние 5 и нижние 5 строчек.
df <- df[order(-df$math),]
head(df, 5)
## height math bio subject gender residence length angle soft
## 23 145 99 100 4 <NA> 1 25 20 R
## 45 173 97 NA 5 female 1 22 23 R
## 43 165 94 78 1 female 2 24 23 R
## 15 158 91 90 1 female 1 50 20 R
## 102 181 88 68 1 female 2 25 30 R
tail(df, 5)
## height math bio subject gender residence length angle soft
## 75 173 NA NA 3 female 2 22 28 SPSS
## 79 161 NA 66 4 female 2 20 30 R
## 81 164 NA NA 5 <NA> 1 30 30 R
## 84 162 NA NA 4 female 1 25 30 SPSS
## 93 175 NA 90 2 female 2 27 30 R
Если Вы хотите вывести табличку, где будет сразу пять верхних и пять нижних строчек, можно склеить результаты функций head() и tail() в одну табличку, используя функцию rbind()
rbind(head(df, 5), tail(df, 5))
## height math bio subject gender residence length angle soft
## 23 145 99 100 4 <NA> 1 25 20 R
## 45 173 97 NA 5 female 1 22 23 R
## 43 165 94 78 1 female 2 24 23 R
## 15 158 91 90 1 female 1 50 20 R
## 102 181 88 68 1 female 2 25 30 R
## 75 173 NA NA 3 female 2 22 28 SPSS
## 79 161 NA 66 4 female 2 20 30 R
## 81 164 NA NA 5 <NA> 1 30 30 R
## 84 162 NA NA 4 female 1 25 30 SPSS
## 93 175 NA 90 2 female 2 27 30 R
df$angle_diff <- df$angle - 18
Если Вы эстет, можно создать переменную абсолютных значений отклонения, воспользовавшись функцией модуля:
df$angle_diff_abs <- abs(df$angle_diff)
Отберем респондентов, изучающих R, и сохраним их в новую базу данных.
r <- subset(df, soft=="R")
Выведем описательные статистики для студентов, изучающих R.
summary(r)
## height math bio subject
## Min. :145.0 Min. :50.00 Min. : 60.00 Min. :1.00
## 1st Qu.:163.0 1st Qu.:70.00 1st Qu.: 73.00 1st Qu.:1.75
## Median :169.0 Median :74.00 Median : 79.00 Median :2.00
## Mean :168.7 Mean :74.12 Mean : 80.83 Mean :2.62
## 3rd Qu.:174.0 3rd Qu.:80.00 3rd Qu.: 90.00 3rd Qu.:4.00
## Max. :190.0 Max. :99.00 Max. :100.00 Max. :5.00
## NA's :8 NA's :13 NA's :1
## gender residence length angle soft
## female:72 Min. :1.000 Min. : 0.00 Min. : 0.00 R :93
## male :18 1st Qu.:1.000 1st Qu.:20.00 1st Qu.:22.00 SPSS: 0
## NA's : 3 Median :1.000 Median :25.00 Median :25.00
## Mean :1.467 Mean :23.79 Mean :26.87
## 3rd Qu.:2.000 3rd Qu.:27.00 3rd Qu.:30.00
## Max. :3.000 Max. :50.00 Max. :60.00
## NA's :1 NA's :1
## angle_diff angle_diff_abs
## Min. :-18.000 Min. : 0.00
## 1st Qu.: 4.000 1st Qu.: 4.50
## Median : 7.000 Median : 8.00
## Mean : 8.871 Mean :10.27
## 3rd Qu.: 12.000 3rd Qu.:12.00
## Max. : 42.000 Max. :42.00
##
Создадим две новых базы данных: в одну сохраним студентов, выбравших математику как любимый предмет; во вторую – всех остальных.
math_lovers <- subset(df, subject == "math")
not_math_lovers <- subset(df, subject != "math")
Посчитаем среднее значение балла ЕГЭ по математике для тех, кто указал математику в качестве любимого предмета.
mean(math_lovers$math, na.rm=T)
## [1] NaN
Посчитаем среднее значение балла ЕГЭ по математике для тех, кто указал любой другой предмет, кроме математики, в качестве любимого.
mean(not_math_lovers$math, na.rm=T)
## [1] 73.19048
Иногда нам требуется отбирать наблюдения по сложным логическим условиям.
Например, если мы хотим отобрать только девушек, которые в качестве любимого предмета указали либо математику, либо биологию, мы это сделаем так:
selected <- subset(df, gender == "female" & (subject == 1 | subject == 2))
dim(selected)
## [1] 50 11
Напомню, что команда dim() позволяет узнать размерность таблицы. Ее результат содержит два числа: первое – это количество строк, а второе – количество столбцов.
Одни и те же условия можно записывать по-разному. Эквивалентной предыдущему будет вот такая запись, в которой мы <<раскрыли скобки>>:
selected <- subset(df, (gender == "female" & subject == 1) | (gender == "female" & subject == 2))
dim(selected)
## [1] 50 11
Никогда не скупитесь проставить скобки, записывая логические условия. Без них R бы подумал, что мы хотим выбрать девушек, которые любят математику, или всех студентов, вне зависимости от их пока, любящих биологию:
selected <- subset(df, gender == "female" & subject == 1 | subject == 2)
dim(selected)
## [1] 61 11
Задание 1. Отобрать студентов, изучающих R, у которых балл ЕГЭ больше 90 хотя бы по одному из двух предметов.
selected_1 <- subset(df, soft == "R" & (math > 90 | bio > 90))
dim(selected_1)
## [1] 18 11
Задание 2. Отобрать молодых людей, указавших, что любимый предмет это математика или биология, которые, указывая длину отрезка, ошиблись не больше, чем на 2 сантиметра. Можно сделать это, используя переменную оценки длины отрезка, вручную прописав удовлетворяющие нас границы. Обратите внимание, что неравенство нестрогое.
selected_2 <- subset(df, gender == "male" & (subject == 1 | subject == 2) & (angle<=20 & angle>=16))
selected_2
## height math bio subject gender residence length angle soft angle_diff
## 30 187 84 89 1 male 1 25 20 SPSS 2
## 14 190 72 86 2 male 2 24 18 R 0
## angle_diff_abs
## 30 2
## 14 0
Можно было сделать по-другому, используя переменную модуля отклонения от истинного значения.
selected_3 <- subset(df, gender == "male" & (subject == 1 | subject == 2) & angle_diff_abs <= 2)
selected_3
## height math bio subject gender residence length angle soft angle_diff
## 30 187 84 89 1 male 1 25 20 SPSS 2
## 14 190 72 86 2 male 2 24 18 R 0
## angle_diff_abs
## 30 2
## 14 0
Задание 3. Отобрать молодых людей, указавших, что любимый предмет это математика или биология, которые, указывая длину отрезка, ошиблись не больше, чем на 2 сантиметра.
selected_4 <- subset(df, gender == "female" & (subject == 3 | subject == 4) & (angle == 18 | length == 22))
selected_4
## height math bio subject gender residence length angle soft angle_diff
## 86 157 70 63 3 female 1 22 30 R 12
## 73 168 56 70 4 female 2 22 28 R 10
## 75 173 NA NA 3 female 2 22 28 SPSS 10
## angle_diff_abs
## 86 12
## 73 10
## 75 10