file.R 🏠

File -> New File -> R Script

  • Код + комментарии(!!!)

  • Можно использовать в RStudio или запускать из коммандной строки

  • Ctrl + enter - запуск строки кода или выделенного фрагмента кода

“Горячие” клавиши

file.Rmd 🏠

Создание отчета

Можно добавлять

  • форматированный текст

  • формулы

  • таблицы

  • код

  • результат выполнения кода

  • картинки

  • ссылки

file.Rmd 🏠

Создание

File -> New File -> R Markdown -> шаблон файла с “шапкой” -> удалить лишнее и добавить нужное -> сохранить -> Knit -> .html/.pdf/.doc

Markdown

Markdown 🏠

  • Текстовый язык разметки

  • Позволяет объединять в одном отчете:

    • код

    • результат анализа данных (таблицы, рисунки, …)

    • комментарии

Markdown: блоки кода 🏠

Блок кода записывают в чанки (“chunk”):

  • Запускается целиком или по чанкам, сразу видны ошибки и проблемы

  • Переменные и функции, инициализированные в одном chunk, будут работать во всей сессии

Markdown 🏠

основные настройки

Устанавливаем TRUE или FALSE

{r echo = T}

  • echo - демонстрация кода

  • eval - выполнение кода

  • message и warnings - демонстрация предупреждений

Markdown: ошибки 🏠

В случае ошибки в коде итоговый документ не будет создан, появится сообщение об ошибке

Читаем ошибку - исправляем - перезапускаем

Markdown - почитать 🏠

Markdown в R

Markdown в R - reference

Работа с векторами

x <- 1:5 
x 
[1] 1 2 3 4 5
length(x)
[1] 5
3 # это тоже вектор длины 1
[1] 3
z <- c("a", "b", "d") # тоже вектор, только строковый
z 
[1] "a" "b" "d"

Внимание!

При перезаписывании содержимого переменной никаких предупреждений не будет

x <- 2 
x
[1] 2
x <- 5 
x
[1] 5

Будьте внимательны при выборе имен для переменных

Индексация 🏠

Индексация элементов в R начинается с 1 (не с 0)

x <- 15:50 
x 
 [1] 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
[26] 40 41 42 43 44 45 46 47 48 49 50

Имена элементов вектора

x <- 1:3 
x 
[1] 1 2 3
names(x)
NULL
names(x) <- c('a', 'b', 'c') 
x 
a b c 
1 2 3 
names(x) 
[1] "a" "b" "c"

Вектора 🏠

У каждого элемента вектора есть:

  • значение

  • индекс или порядковый номер

  • имя (может быть пустым)

Способы создания вектора

Функция с() 🏠

c(1, 2, 3)
[1] 1 2 3
c(5, 12, 41)
[1]  5 12 41
c('a', 'g', 'f')
[1] "a" "g" "f"

Последовательности 🏠

1:10
 [1]  1  2  3  4  5  6  7  8  9 10
5:-3
[1]  5  4  3  2  1  0 -1 -2 -3
seq(17)
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17

Последовательности 🏠

seq(1, 8, by = 2)
[1] 1 3 5 7
seq(0, 1, length.out = 11)
 [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

Объединение 🏠

x <- 1:3
x
[1] 1 2 3
x <- c(x, 5:7)
x
[1] 1 2 3 5 6 7

Повторы 🏠

rep(1:3, times = 3)
[1] 1 2 3 1 2 3 1 2 3
rep(1:3, each = 3)
[1] 1 1 1 2 2 2 3 3 3
rep(1:3, length.out = 8)
[1] 1 2 3 1 2 3 1 2

Обратите внимание на длины векторов, которые получаются!

Повторы 🏠

x <- c('a', 'h')
x
[1] "a" "h"
rep(x, each = 4)
[1] "a" "a" "a" "a" "h" "h" "h" "h"
y <- c('A', 'H')
y
[1] "A" "H"
rep(c(x, y), times = 2)
[1] "a" "h" "A" "H" "a" "h" "A" "H"

Работа с переменными

Работа с переменными

ls() # список переменных из глобального окружения
rm(a, b) # удалить переменные a и b

rm(list=ls()) # удалить все переменные из глобального окружения

Названия переменных

НЕ должны:

  • начинаться с цифр

  • содержать пробелы

  • содержать специальные символы (+, -, /, , *, ^, …)

  • состоять из разезервированных слов (if, else, repeat, while, function, for, in, next, break, TRUE, FALSE, NULL, Inf, NaN, NA, …)

Data Frame

Кадры данных или данные табличного вида

Data frame

Создание

a <- c(5,4,8)
b <- c('a','b','c')
h <- c(T,F,T) 
g <- c(1.5,2.5,3.7) 
df <- data.frame(a,b,h)
df
  a b     h
1 5 a  TRUE
2 4 b FALSE
3 8 c  TRUE



df <- data.frame(a = c(5,4,8),
                 b = c('a','b','c'),
                 h = c(T,F,T),
                 g = c(1.5,2.5,3.7))
df
  a b     h   g
1 5 a  TRUE 1.5
2 4 b FALSE 2.5
3 8 c  TRUE 3.7

Data frame

Структура

df
  a b     h   g
1 5 a  TRUE 1.5
2 4 b FALSE 2.5
3 8 c  TRUE 3.7
str(df)
'data.frame':   3 obs. of  4 variables:
 $ a: num  5 4 8
 $ b: chr  "a" "b" "c"
 $ h: logi  TRUE FALSE TRUE
 $ g: num  1.5 2.5 3.7
dim(df)
[1] 3 4

Data frame 🏠

Строки и столбцы

df
  a b     h   g
1 5 a  TRUE 1.5
2 4 b FALSE 2.5
3 8 c  TRUE 3.7
colnames(df)
[1] "a" "b" "h" "g"
rownames(df)
[1] "1" "2" "3"

Data frame 🏠

Наполнение

df
  a b     h   g
1 5 a  TRUE 1.5
2 4 b FALSE 2.5
3 8 c  TRUE 3.7
head(df, 2)
  a b     h   g
1 5 a  TRUE 1.5
2 4 b FALSE 2.5
tail(df, 3)
  a b     h   g
1 5 a  TRUE 1.5
2 4 b FALSE 2.5
3 8 c  TRUE 3.7

Встроенные наборы данных

data()


?swiss

swiss

head(swiss,4)
             Fertility Agriculture Examination Education Catholic
Courtelary        80.2        17.0          15        12     9.96
Delemont          83.1        45.1           6         9    84.84
Franches-Mnt      92.5        39.7           5         5    93.40
Moutier           85.8        36.5          12         7    33.77
             Infant.Mortality
Courtelary               22.2
Delemont                 22.2
Franches-Mnt             20.2
Moutier                  20.3
str(swiss)
'data.frame':   47 obs. of  6 variables:
 $ Fertility       : num  80.2 83.1 92.5 85.8 76.9 76.1 83.8 92.4 82.4 82.9 ...
 $ Agriculture     : num  17 45.1 39.7 36.5 43.5 35.3 70.2 67.8 53.3 45.2 ...
 $ Examination     : int  15 6 5 12 17 9 16 14 12 16 ...
 $ Education       : int  12 9 5 7 15 7 7 8 7 13 ...
 $ Catholic        : num  9.96 84.84 93.4 33.77 5.16 ...
 $ Infant.Mortality: num  22.2 22.2 20.2 20.3 20.6 26.6 23.6 24.9 21 24.4 ...

swiss

Обращение к столбцу

colnames(swiss)
[1] "Fertility"        "Agriculture"      "Examination"      "Education"       
[5] "Catholic"         "Infant.Mortality"
swiss$Education
 [1] 12  9  5  7 15  7  7  8  7 13  6 12  7 12  5  2  8 28 20  9 10  3 12  6  1
[26]  8  3 10 19  8  2  6  2  6  3  9  3 13 12 11 13 32  7  7 53 29 29
table(swiss$Education)

 1  2  3  5  6  7  8  9 10 11 12 13 15 19 20 28 29 32 53 
 1  3  4  2  4  7  4  3  2  1  5  3  1  1  1  1  2  1  1 

Data frame

Срезы

dim(swiss)
[1] 47  6
head(swiss,3)
             Fertility Agriculture Examination Education Catholic
Courtelary        80.2        17.0          15        12     9.96
Delemont          83.1        45.1           6         9    84.84
Franches-Mnt      92.5        39.7           5         5    93.40
             Infant.Mortality
Courtelary               22.2
Delemont                 22.2
Franches-Mnt             20.2
swiss[3,6] 
[1] 20.2

Data frame 🏠

Срезы

swiss[8,]
      Fertility Agriculture Examination Education Catholic Infant.Mortality
Glane      92.4        67.8          14         8    97.16             24.9
swiss[1:3,]
             Fertility Agriculture Examination Education Catholic
Courtelary        80.2        17.0          15        12     9.96
Delemont          83.1        45.1           6         9    84.84
Franches-Mnt      92.5        39.7           5         5    93.40
             Infant.Mortality
Courtelary               22.2
Delemont                 22.2
Franches-Mnt             20.2
swiss['Courtelary',c('Examination','Education')]
           Examination Education
Courtelary          15        12

Data frame 🏠

Выбор данных по условию

table(swiss$Education)

 1  2  3  5  6  7  8  9 10 11 12 13 15 19 20 28 29 32 53 
 1  3  4  2  4  7  4  3  2  1  5  3  1  1  1  1  2  1  1 
vec <- c(12,15)
vec
[1] 12 15
mt <- swiss[swiss$Education %in% vec,]

Data frame 🏠

Выбор данных по условию

table(mt$Education)

12 15 
 5  1 
mt <- swiss[!(swiss$Education %in% vec),]
table(mt$Education)

 1  2  3  5  6  7  8  9 10 11 13 19 20 28 29 32 53 
 1  3  4  2  4  7  4  3  2  1  3  1  1  1  2  1  1 

which

swiss[1:3,1:3]
             Fertility Agriculture Examination
Courtelary        80.2        17.0          15
Delemont          83.1        45.1           6
Franches-Mnt      92.5        39.7           5
which(swiss$Examination == 6)
[1]  2 27
which(colnames(swiss) == 'Examination')
[1] 3
which.min(swiss$Examination)
[1] 31
which.max(swiss$Examination)
[1] 45

Data frame

Выбор данных по условию

swiss[swiss$Fertility > 40 & swiss$Education < 8,]
             Fertility Agriculture Examination Education Catholic
Franches-Mnt      92.5        39.7           5         5    93.40
Moutier           85.8        36.5          12         7    33.77
Porrentruy        76.1        35.3           9         7    90.57
Broye             83.8        70.2          16         7    92.85
Gruyere           82.4        53.3          12         7    97.67
Veveyse           87.1        64.5          14         6    98.61
Aubonne           66.9        67.5          14         7     2.27
Cossonay          61.7        69.3          22         5     2.82
Echallens         68.3        72.6          18         2    24.20
Moudon            65.0        55.1          14         3     4.52
Orbe              57.4        54.1          20         6     4.20
Oron              72.5        71.2          12         1     2.40
Paysd'enhaut      72.0        63.5           6         3     2.56
Conthey           75.5        85.9           3         2    99.71
Entremont         69.3        84.9           7         6    99.68
Herens            77.3        89.7           5         2   100.00
Martigwy          70.5        78.2          12         6    98.96
Monthey           79.4        64.9           7         3    98.22
Sierre            92.2        84.6           3         3    99.46
Val de Ruz        77.6        37.6          15         7     4.97
ValdeTravers      67.6        18.7          25         7     8.65
             Infant.Mortality
Franches-Mnt             20.2
Moutier                  20.3
Porrentruy               26.6
Broye                    23.6
Gruyere                  21.0
Veveyse                  24.5
Aubonne                  19.1
Cossonay                 18.7
Echallens                21.2
Moudon                   22.4
Orbe                     15.3
Oron                     21.0
Paysd'enhaut             18.0
Conthey                  15.1
Entremont                19.8
Herens                   18.3
Martigwy                 19.4
Monthey                  20.2
Sierre                   16.3
Val de Ruz               20.0
ValdeTravers             19.5

Матрицы

Что такое матрица?

x <- 1:6
dim(x)
NULL

Что такое матрица?

x <- c(20:31)
m <- matrix(x, nrow = 3)
colnames(m) <- c('a', 'b', 'c', 'd')
rownames(m) <- c(1, 2, 3)
dim(m) # 2 строки и 3 столбца
[1] 3 4

Матрицы

  • Внешне похожи на таблицу

  • Вектор с атрибутом dim

  • Все элементы одного типа

  • Математические операции работают быстрее

Способы создания матрицы 🏠

m1 <- matrix(1:6, nrow=2, ncol=3)
m1 
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
m2 <- matrix(1:6, nrow=2, ncol=3,byrow=T)
m2 
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
as.matrix(1:3) 
     [,1]
[1,]    1
[2,]    2
[3,]    3

Способы создания матрицы 🏠

v <- 1:6
dim(v) 
NULL
dim(v) = c(2,3) 
v 
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
is.matrix(v)
[1] TRUE

Способы создания матрицы 🏠

a <- c(1,2,3)
b <- c(4,5,6) 
rbind(a,b) 
  [,1] [,2] [,3]
a    1    2    3
b    4    5    6
cbind(a,b) 
     a b
[1,] 1 4
[2,] 2 5
[3,] 3 6

Матрицы: cрезы 🏠

m1 <- matrix(1:6, nrow=2, ncol=3)
m1 
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
m1[2,3] # взять элемент на пересечении 2 строки и 3 столбца 
[1] 6
m1[2,] # взять вторую строку 
[1] 2 4 6
m1[,3] # взять третий столбец 
[1] 5 6
m1[,3, drop = F] # взять третий столбец в виде матрицы 
     [,1]
[1,]    5
[2,]    6

Матрицы: изменение значений 🏠

m1 <- matrix(1:6, nrow=2, ncol=3)
m1 
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
m1[2,3] = 9 
m1
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    9

Матрицы: создать пустую матрицу 🏠

m1 <- matrix(nrow=2, ncol=3)
m1 
     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]   NA   NA   NA

Матрицы 🏠

m1 <- matrix(1:6,nrow=2, ncol=3)
m1 
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
rownames(m1)
NULL
colnames(m1)
NULL
rownames(m1) = c('r1','r2')
colnames(m1) = c('c1','c2','c3') 
m1 
   c1 c2 c3
r1  1  3  5
r2  2  4  6

Имена строк и столбцов должны быть уникальными!

Имена элементов вектора

a <- c('f', 'g', 'h') # создаем неименованный вектор
a
[1] "f" "g" "h"
b <- c(a = 'f', b = 'g', c = 'h') # сразу создаем именованный вектор
b
  a   b   c 
"f" "g" "h" 

Имена элементов вектора

x <- 1:3 
x 
[1] 1 2 3
names(x)
NULL
names(x) <- c('a', 'b', 'c') 
x 
a b c 
1 2 3 
names(x) 
[1] "a" "b" "c"

Конец!