к.соц.н., Карен Аванесян
Апрель 2018, Ростов-на-Дону
R работает как кулькулятор
5 + 5
[1] 10
5 * 5
[1] 25
(5 + 5) * 5
[1] 50
Более продвинутые арифметические функции также поддерживаются
sqrt(100)
[1] 10
6^7
[1] 279936
exp(7)
[1] 1096.633
Вектор - один из основных и наиболее базовый тип данных в R.
x1 <- c(1, 2, 2) # Numeric
x2 <- c("a", "b", "c") # Character
x3 <- c(TRUE, FALSE, FALSE) # Logical
x <- 8
y <- 9
z<- x*y #мы можем умножить две величины, сохранив результат в z
z #чтобы посмотреть результат операции, z нужно вызвать отдельно
[1] 72
Векторы могут состоять также из множества значений
x <- c(1, 2, 3, 4, 10)
y <- c(17, 45, 8, 11, 5)
x*y
[1] 17 90 24 44 50
x <- c(1, 2, 3, 4, 10)
y <- c(17, 45, 8, 11, 5)
z<- x * y #умножим один вектор на другой
z #проверим полученное значение
[1] 17 90 24 44 50
length(z) #сколько значений в векторе
[1] 5
class(z) #к какому классу относится z
[1] "numeric"
students <- c("Иванов", "Петров", "Сидоров", "Макаров")
age <- c(17, 17, 19, 16)
names(age)<- students #присваиваем имена количественному вектору
age
Иванов Петров Сидоров Макаров
17 17 19 16
mean(age) #вычисляет средний возраст студентов
[1] 17.25
Матрицы - еще один тип данных в R. Представим, что у нас есть 3 студента, сдавшие для поступления в ВУЗ ЕГЭ по трем предметам. Попробуем создать матрицу.
Ivanov <- c(64, 67, 50)
Petrov <- c(78, 87, 91)
Sidorov <- c(60, 80, 40)
ege <- c(Ivanov, Petrov, Sidorov)
ege
[1] 64 67 50 78 87 91 60 80 40
ege_matrix <- matrix(ege, nrow = 3, byrow = TRUE) #из вектора ege создаются строки матрицы
#необходимо создать имена для строк и столбцов матрицы
students <- c("Иванов", "Петров", "Сидоров")
subjects <- c("Английский", "Русский", "История")
rownames(ege_matrix)<- students
colnames(ege_matrix)<- subjects
ege_matrix
Английский Русский История
Иванов 64 67 50
Петров 78 87 91
Сидоров 60 80 40
Нам также может быть интересно, каков суммарный балл студента по трем экзаменам. Мы можем создать и добавить этот столбец в нашу матрицу.
total_score <- rowSums(ege_matrix)
ege_matrix <- cbind(ege_matrix, total_score)
subjects <- c("Английский", "Русский", "История", "Всего")
colnames(ege_matrix)<- subjects
ege_matrix
Английский Русский История Всего
Иванов 64 67 50 181
Петров 78 87 91 256
Сидоров 60 80 40 180
Еще один тип данных в R - это факторы.
#создаем векторы с текстовыми данными
gender <- c("М", "Ж", "Ж", "М")
educ<-c("высшее","среднее","высшее","начальное")
gender <- factor(gender) #конвертируем в фактор
educ <- factor(educ)
gender #мы видим значения и уровни (levels)
[1] М Ж Ж М
Levels: Ж М
educ
[1] высшее среднее высшее начальное
Levels: высшее начальное среднее
Номинальные факторы (обозначают качественную принадлежность к какой-то категории)
subject <- c("клиническая психология", "когнитивная психология", "педагогика","педагогика" ) #создаем вектор из 4 студентов
subject <- factor(subject) #трансформируем его в фактор с тремя уровнями/значениями
subject
[1] клиническая психология когнитивная психология педагогика
[4] педагогика
Levels: клиническая психология когнитивная психология педагогика
Ординальные факторы (обозначают качественную принадлежность к какой-то категории с иерархией)
study_prog <- c("бакалавриат", "специалитет", "магистратура", "бакалавриат") #мы создали вектор из 4 наблюдений
study_prog <- factor(study_prog, ordered = TRUE, labels = c("бакалавриат", "специалитет", "магистратура"))
study_prog
[1] бакалавриат магистратура специалитет бакалавриат
Levels: бакалавриат < специалитет < магистратура
Пришло время научиться создавать наборы данных в R
id <- 1:7 #создаст ряд с номерами от 1 до 7
students <- c("Анна", "Марк", "Екатерина", "Дмитрий", "Наталья", "Николай", "Михаил")
discipline <- c("философия", "литература", "социология", "филология", "политология", "история", "психология")
age <- c(18, 17, 22, 22, 19, 21, 20)
math_grade <- c("отл", "отл", "хор", "удовл", "удовл", "неудовл", "отл")
#Создадим таблицу данных из векторов
group_data_frame <- data.frame(id, students, discipline, age, math_grade)
group_data_frame
id students discipline age math_grade
1 1 Анна философия 18 отл
2 2 Марк литература 17 отл
3 3 Екатерина социология 22 хор
4 4 Дмитрий филология 22 удовл
5 5 Наталья политология 19 удовл
6 6 Николай история 21 неудовл
7 7 Михаил психология 20 отл
Обзор структуры, параметров и содержания любого ряда данных можно выполнять при помощи трех базовых команд
str(group_data_frame)
summary(group_data_frame)
View(group_data_frame)
В среде R существуют базовые операции с data frames.
group_data_frame[,1] #дает элементы первого столбца
group_data_frame[1,] #дает элементы первой строки
group_data_frame$discipline #выбирает переменную
mean(group_data_frame$age) #среднее возраста
group_data_frame$age[group_data_frame$students ="Екатерина"] #возраст Екатерины
median(group_data_frame$age[group_data_frame$math_grade="отл"]) #медиана возраста отличников
Мы также в любой момент можем добавить в таблицу данных столбцы (переменные)…
scholarship<-c(TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE)
df <- cbind(group_data_frame, scholarship)
…Или строки (наблюдения).
newrow <- data.frame(id = 8, students = "Марина", discipline = "культурология", age = 16, math_grade = "хор", scholarship = TRUE)
df <- rbind(df, newrow)
Зачастую мы заинтересованы не во всей базе данных, а в какой-то части. Для этого существует ряд команд.
name <- c("Мария", "Иван", "Екатерина", "Николай", "Наталья")
gender <- c("female", "male", "female", "male", "female")
depression_test <- c(4, 7, 9, 1, 6)
exam1 <- c(5, 3, 5, 2, 4)
exam2 <- c(4, 3, 5, 3, 4)
df <- data.frame(name, gender, depression_test, exam1, exam2)
df
name gender depression_test exam1 exam2
1 Мария female 4 5 4
2 Иван male 7 3 3
3 Екатерина female 9 5 5
4 Николай male 1 2 3
5 Наталья female 6 4 4
df[4,4] #Оценка Николая по первому экзамену
[1] 2
df[1,] #Данные по Марии
name gender depression_test exam1 exam2
1 Мария female 4 5 4
df[1:2, 4] #Оценки первых двух студентов по первому экзамнеу
[1] 5 3
# df[1:4, 'exam1'] делает то же самое
df[c(1, 3), c("name", "exam1")]
name exam1
1 Мария 5
3 Екатерина 5
head(df[df$gender == 'female', 1:2])
name gender
1 Мария female
3 Екатерина female
5 Наталья female
subset(df, gender == 'female')
name gender depression_test exam1 exam2
1 Мария female 4 5 4
3 Екатерина female 9 5 5
5 Наталья female 6 4 4
subset(df, exam2 > 3)
name gender depression_test exam1 exam2
1 Мария female 4 5 4
3 Екатерина female 9 5 5
5 Наталья female 6 4 4
subset(df, gender == "male" & exam1 > 2)
name gender depression_test exam1 exam2
2 Иван male 7 3 3