Що таке R?

R це середовище в якому можна:

  1. Виконувати будь-які обчислення;

  2. Програмувати;

  3. Будувати графіки;

Почнемо з простого. Арифметичні операції суми і добутку

2 + 3
## [1] 5
3*6
## [1] 18

Арифметичні операції різниці і ділення

5 - 2
## [1] 3
6/2
## [1] 3

Піднесення до степеня

2^3
## [1] 8

Команди можна закоментовувати знаком #

(2 + 3*4)/2 #5 - 3 
## [1] 7

Крапка з комою

крапка з комою (або наступний рядок) відділяють різні вирази

1+2*3^2; 2^3*2
## [1] 19
## [1] 16

Правила виконання складних виразів

Спочатку виконується піднесення до степеня, потім множення і ділення, потім сума і різниця. Дужки мають пріоритет над всім. Якщо операції мають однаковий пріоритет, то зліва направо.

Використаємо те що ми знаємо для перевірки задачі

Математик Лейбніц показав, що \(n^3 - n\) завжди ділиться на 3. Давайте ми це перевіримо для деяких \(n\):

(2^3-2)/3
## [1] 2

Перевірка

(2^3-2)/3
## [1] 2
(3^3-3)/3
## [1] 8
(4^3-4)/3
## [1] 20
(5^3-5)/3
## [1] 40

Задача 1

Перевірити (для деяких значень) також твердження:

  1. \(n^2 - n\) завжди ділиться на 2

  2. \(n^4 - n\) завжди ділиться на 4

  3. \(n^5 - n\) завжди ділиться на 5

Особливості доведення

Загальне твердження не можна довести будь-якою кількістю успішних одиночних експериментів але можна спростувати одним неуспішним.

Продовжуємо досліджувати операції в R

Цілочисельне ділення і залишок

5 %/% 3
## [1] 1
5 %% 3
## [1] 2

Навіщо цілочисленне ділення?

Давайте переведемо 256 хвилин у години.

Ще декілька функцій які можуть знадобитись

exp(1)
## [1] 2.718282
exp(log(5))
## [1] 5
sin(pi/2)
## [1] 1
cos(pi/2)
## [1] 6.123234e-17

Функцій дуже багато але ще декілька важливих

max(4,2,5,1) # максимум 
sum(4,2,5,1) # сума
prod(4,2,5,1) # добуток
factorial(4) # факторіал
sqrt(4) # квадратний корінь

Що більше?

Складні задачі з мого 11 класу

  1. що більше \(e^\pi\) чи \(\pi^e\)?

  2. що більше \(3^\pi\) чи \(\pi^3\)?

Отримання допомоги

help(solve)
?solve
help("exp")
help.start()
help.search("solve")
??solve
example(exp)
example("*")

Присвоєння

x <- 5 # Загальноприйнята форма присвоєння
x
## [1] 5
6 -> y # Можливо але незвично
y
## [1] 6
z = 8 # Можливо але незвично
z
## [1] 8

Порівняння

4 == 4
## [1] TRUE
4 == 5
## [1] FALSE
4 == 3 + 1
## [1] TRUE
2 < 3
## [1] TRUE

Порівняння

3 <= 4
## [1] TRUE
3 != 5
## [1] TRUE

Логічні операції І та АБО

TRUE & TRUE
TRUE & FALSE
TRUE | FALSE
FALSE | FALSE
FALSE | TRUE

Логічні операції І та АБО

TRUE & TRUE
## [1] TRUE
TRUE & FALSE
## [1] FALSE
TRUE | FALSE
## [1] TRUE
FALSE | FALSE
## [1] FALSE
FALSE | TRUE
## [1] TRUE

Логічні операції

5 > 3 & 0 != 1
5 > 3 & 0 != 0
! TRUE
! FALSE
! ( 5 == 5 )

Графіки

Графік сінуса

plot(sin, from=-10, to=10)

Графік кореня

plot(sqrt,from=0,to=10)

Вектори

Одним з найважливіших об’єктів в R є вектори. Вектор - це послідовність чогось.

Головні функції для створення векторів: с(), seq(), rep()

Створення векторів переліченням

c(2,5,3,7)
## [1] 2 5 3 7
c(1,2,3,4,5,6,7,8,9,10)
##  [1]  1  2  3  4  5  6  7  8  9 10

Створення векторів функцією seq()

seq(from=1,to=10,by=3)
seq(from=3,to=7)
seq(1,11,3)
seq(3,7)

Функція seq()

help(seq)
example(seq)

seq(from, to, by)

from - з якого числа починати

to - на якому числі закінчувати (не перевищувати)

by - з яким кроком йти

Для скорочення створення векторів використовують ‘:’

3:7 # це те саме, що seq(3,7,1)
## [1] 3 4 5 6 7

Створіть вектор всіх чисел від 1 до 100

Задача 2

Отримати наступні послідовності:

  1. Всі непарні числа від 1 до 100

  2. Всі числа, що кратні 5 від 1 до 200

  3. Числа виду \(n\pi\) де \(n\) від 1 до 10

Комбінування послідовностей

  1. Як зробити послідовність 1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1?

  2. Як зробити послідовність 2 4 6 8 10 1 3 5 7 9?

Типи даних

Які типи взагалі існують в R? Атомарних типів 5:

  1. character
  2. numeric (real numbers)
  3. integer
  4. complex
  5. logical (True/False)

Вектори інших типів

Вектор містить елементи одного типу!

c("a","b","c","d")
## [1] "a" "b" "c" "d"
c(T,F,T)
## [1]  TRUE FALSE  TRUE
c(TRUE,FALSE,TRUE)
## [1]  TRUE FALSE  TRUE

Визначення типу

class(c("a","b","c","d"))
## [1] "character"
class(c(T,F,T))
## [1] "logical"
class(1:3)
## [1] "integer"

Перетворення типів

x <- c(T,F,T)
x
## [1]  TRUE FALSE  TRUE
as.character(x)
## [1] "TRUE"  "FALSE" "TRUE"

Приведення до більш загального типу

Якого типу вектори?

y <- c(1.7, "a")
y <- c(TRUE, 2)
y <- c("a", TRUE)

Функція rep()

Функція повторення послідовностей має форму:

rep(x, times = 1, length.out = NA, each = 1)

rep(x, times = 1, len = NA, each = 1)

Приклади

rep(c(1,2,3),3)
## [1] 1 2 3 1 2 3 1 2 3
rep(c(1,2,3),1:3)
## [1] 1 2 2 3 3 3
rep(c(1,2,3),each = 3)
## [1] 1 1 1 2 2 2 3 3 3
rep(c(1,2,3),2,each = 3)
##  [1] 1 1 1 2 2 2 3 3 3 1 1 1 2 2 2 3 3 3

Задача 3. Спробуйте написати що буде в результаті виконання

rep(1:4,2)
rep(1:4,times = 2, length.out = 5)
rep(1:4, each = 2)
rep(1:4, c(2,2,2,2))
rep(1:4, c(1,1,1,2))
rep(0:2,3)
rep(7:9,2:4)

Якщо створити змінну - вектор, то як отримати доступ до кожного елементу?

x <- c(12,15,13,17,11)
x[4]
x[3:5]
x[-2]
x[-(3:5)]

А що буде як додати два вектори?

c(2,5,3) + c(4,2,7)
1:5 + 1:10
1:5 + 2

Те саме з множенням

c(2,5,3) * c(4,2,7)
## [1]  8 10 21
1:3*5
## [1]  5 10 15
1:3*1:6
## [1]  1  4  9  4 10 18

Взагалі фішка R це векторні операції

x <- 1:100
x^2
##   [1]     1     4     9    16    25    36    49    64    81   100   121
##  [12]   144   169   196   225   256   289   324   361   400   441   484
##  [23]   529   576   625   676   729   784   841   900   961  1024  1089
##  [34]  1156  1225  1296  1369  1444  1521  1600  1681  1764  1849  1936
##  [45]  2025  2116  2209  2304  2401  2500  2601  2704  2809  2916  3025
##  [56]  3136  3249  3364  3481  3600  3721  3844  3969  4096  4225  4356
##  [67]  4489  4624  4761  4900  5041  5184  5329  5476  5625  5776  5929
##  [78]  6084  6241  6400  6561  6724  6889  7056  7225  7396  7569  7744
##  [89]  7921  8100  8281  8464  8649  8836  9025  9216  9409  9604  9801
## [100] 10000

Задача 4.

  1. Створити послідовність \(\frac{n(n + 1)}{2}\) і порівняти її з сумою \(1 + 2 + ... + n\)

  2. Створити послідовність \(\frac{n^2(n + 1)^2}{4}\) і порівняти її з сумою \(1^3 + 2^3 + ... + n^3\)

В R кожен вектор індексується логічними змінними

x <- 1:5
x > 3
f <- x > 3
x[f] 

Наприклад створимо вектор з непарними елементами

x <- 1:100
f <- (x %% 2) == 1
x[f]
##  [1]  1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45
## [24] 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91
## [47] 93 95 97 99

Можна також змінювати елементи за правилами

y <- 1:100
y[y>50] <- 0
y
##   [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
##  [24] 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
##  [47] 47 48 49 50  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
##  [70]  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
##  [93]  0  0  0  0  0  0  0  0

Ще декілька важливих функцій

length(x) # довжина вектора (кількість елементів)
rev(x) # повернути вектор навпаки
sort(x) # сортувати вектор у певному порядку
unique(x) # вивести значення х без повторів

Спробуємо тепер написати власну функцію

square <- function(x) {
  x^2
}
square(1:5)
## [1]  1  4  9 16 25

Напишіть функцію, яка повертає \(x^2 + y^2\)

Відсотки

my_percent <- function(x, p) {
  x * p/100
}
my_percent_growth <- function(x, p){
  x * (1 + p/100)
}

Як зростає депозит?

Людина дає гроші банку. Банк визначає ставку. Потім щорічно банк додає до суми відсотки. За рік отримаємо:

my_percent_growth(100,15)
## [1] 115

Як зростає депозит за декілька років (складні відсотки)?

my_percent_growth <- function(x, p, n = 1){
  x * (1 + p/100)^n
}

За десять років

my_percent_growth(100,15,10)
## [1] 404.5558
my_percent_growth(100,15,20)
## [1] 1636.654
my_percent_growth(100,15,30)
## [1] 6621.177

Правило 72

Якщо поділити 72 на відсотки ми отримаємо час подвоєння депозита.

Завдання. Перевірити це правило.

Задача

Що вигідніше покласти 100 грн на 10 років під 15 відсотків, чи 500 на рік під 15 відсотків?

Давайте дослідимо трохи реальний датасет

head(faithful)
##   eruptions waiting
## 1     3.600      79
## 2     1.800      54
## 3     3.333      74
## 4     2.283      62
## 5     4.533      85
## 6     2.883      55

В нас є два вектори

час виверження час очікування

Задача. Створимо два вектори

eruptions <- faithful$eruptions
waiting <- faithful$waiting

Знайти максимальне і мінімальне значення

Знайти середнє значення

Давайте напишемо функцію для обчислення середнього значення

average <- function(x){
  ??
}

Графік

plot(faithful)

Домашнє завдання (на тиждень)

  1. Створіть наступні послідовності (з використанням тільки функцій seq rep і ʼ:ʼ):

1.1. 1 1 3 3 5 5 7 7 1 1 3 3 5 5 7 7

1.2. 3 5 7 9 11 8 10 12 14 16

1.3. 2 3 4 5 7 8 9 10 12 13 14 15

1.4. 2 4 6 9 11 13 16 18 20 20 22 24 27 29 31 34 36 38

  1. Для вектору часу затримки між виверженнями гейзеру знайти:

2.1. Кількість вимірів у векторі

2.2. Суму всіх елементів

2.3 Кількість всіх елементів, що більші за середнє.

  1. Створити послідовність Фібоначчі: 1, 1, 2, 3, 5, 8, … Кожен наступний дорівнює сумі двох попередніх. Перші два - одиниці. Обчислити перші 100 елементів.

  2. Створити послідовність за попереднім правилом для початкових чисел 1, 3.

  3. Перевірити що \(n^3 + (n+1)^3 + (n+2)^3\) ділиться на 9.

  4. Створити послідовність чисел, що діляться на 3 або 7 або 9 без залишку.