Статистическое Программирование и Анализ Данных в Психолого-Педагогических и Социальных Исследованиях.

к.соц.н., Карен Аванесян
Апрель 2018, Ростов-на-Дону

R как Калькулятор (1)

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

5 + 5
[1] 10
5 * 5
[1] 25
(5 + 5) * 5
[1] 50

R как Калькулятор (2)

Более продвинутые арифметические функции также поддерживаются

sqrt(100)
[1] 10
6^7
[1] 279936
exp(7)
[1] 1096.633

Векторы в R (1)

Вектор - один из основных и наиболее базовый тип данных в 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

Векторы в R (2)

Векторы могут состоять также из множества значений

x <- c(1, 2, 3, 4, 10) 
y <- c(17, 45, 8, 11, 5)
x*y 
[1] 17 90 24 44 50

Векторы в R (3)

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"

Векторы в R (4)

students <- c("Иванов", "Петров", "Сидоров", "Макаров") 
age <- c(17, 17, 19, 16)
names(age)<- students #присваиваем имена количественному вектору
age
 Иванов  Петров Сидоров Макаров 
     17      17      19      16 
mean(age) #вычисляет средний возраст студентов
[1] 17.25

Матрицы в R (1)

Матрицы - еще один тип данных в 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

Матрицы в R (2)

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

Матрицы в R (3)

Нам также может быть интересно, каков суммарный балл студента по трем экзаменам. Мы можем создать и добавить этот столбец в нашу матрицу.

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 (1)

Еще один тип данных в R - это факторы.

#создаем векторы с текстовыми данными 
gender <- c("М", "Ж", "Ж", "М")
educ<-c("высшее","среднее","высшее","начальное")
gender <- factor(gender) #конвертируем в фактор
educ <- factor(educ)
gender #мы видим значения и уровни (levels)
[1] М Ж Ж М
Levels: Ж М
educ
[1] высшее    среднее   высшее    начальное
Levels: высшее начальное среднее

Факторы в R (2)

Номинальные факторы (обозначают качественную принадлежность к какой-то категории)

subject <- c("клиническая психология", "когнитивная психология", "педагогика","педагогика" ) #создаем вектор из 4 студентов
subject <- factor(subject) #трансформируем его в фактор с тремя уровнями/значениями
subject
[1] клиническая психология когнитивная психология педагогика            
[4] педагогика            
Levels: клиническая психология когнитивная психология педагогика

Факторы в R (3)

Ординальные факторы (обозначают качественную принадлежность к какой-то категории с иерархией)

study_prog <- c("бакалавриат", "специалитет", "магистратура", "бакалавриат") #мы создали вектор из 4 наблюдений

study_prog <- factor(study_prog, ordered = TRUE, labels = c("бакалавриат", "специалитет", "магистратура"))
study_prog
[1] бакалавриат  магистратура специалитет  бакалавриат 
Levels: бакалавриат < специалитет < магистратура

Таблицы данных (Data Frames) в R (1)

Пришло время научиться создавать наборы данных в 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)

Таблицы данных (Data Frames) в R (2)

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)

Таблицы данных (Data Frames) в R (3)

В среде 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="отл"]) #медиана возраста отличников

Таблицы данных (Data Frames) в R (3)

Мы также в любой момент можем добавить в таблицу данных столбцы (переменные)…

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) 

Create Data

Зачастую мы заинтересованы не во всей базе данных, а в какой-то части. Для этого существует ряд команд.

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

Selecting

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'] делает то же самое

Subsetting (1)

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

Subsetting (2)

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

Subsetting (2)

subset(df, gender == "male" & exam1 > 2)
  name gender depression_test exam1 exam2
2 Иван   male               7     3     3