Перевірити (для деяких значень) також твердження:
\(n^2 - n\) завжди ділиться на 2
\(n^4 - n\) завжди ділиться на 4
\(n^5 - n\) завжди ділиться на 5
x <- 1:100
(x^2-x)/2
## [1] 0 1 3 6 10 15 21 28 36 45 55 66 78 91
## [15] 105 120 136 153 171 190 210 231 253 276 300 325 351 378
## [29] 406 435 465 496 528 561 595 630 666 703 741 780 820 861
## [43] 903 946 990 1035 1081 1128 1176 1225 1275 1326 1378 1431 1485 1540
## [57] 1596 1653 1711 1770 1830 1891 1953 2016 2080 2145 2211 2278 2346 2415
## [71] 2485 2556 2628 2701 2775 2850 2926 3003 3081 3160 3240 3321 3403 3486
## [85] 3570 3655 3741 3828 3916 4005 4095 4186 4278 4371 4465 4560 4656 4753
## [99] 4851 4950
Отримати наступні послідовності:
Всі непарні числа від 1 до 100
Всі числа, що кратні 5 від 1 до 200
Числа виду \(n\pi\) де \(n\) від 1 до 10
average <- function(x) { # є стандартна реалізація mean
n <- length(x)
sum(x) / n
}
Створити послідовність \(\frac{n(n + 1)}{2}\) і порівняти її з сумою \(1 + 2 + ... + n\)
Створити послідовність \(\frac{n^2(n + 1)^2}{4}\) і порівняти її з сумою \(1^3 + 2^3 + ... + n^3\)
x <- 1:100
test <- function(n){
sum(1:n) == n*(n + 1)/2
}
test(10)
square <- function(x) {
x^2
}
square(1:5)
## [1] 1 4 9 16 25
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 на відсотки ми отримаємо час подвоєння депозита. задачка - перевірити правило :)
Що вигідніше покласти 100 грн на 10 років під 15 відсотків, чи 500 на рік під 15 відсотків?
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
rep(seq(1,7,2),times = 2,each = 2)
seq(1,10,1) + seq(2,6,1)
seq(1,12,1) + rep(1:3,each = 4)
rep(1:3,2,each=3) + seq(1,36,2)
2.1. Кількість вимірів у векторі
2.2. Суму всіх елементів
2.3 Кількість всіх елементів, що більші за середнє.
w <- faithful$waiting
sum(w > mean(w))
Створити послідовність Фібоначчі: 1, 1, 2, 3, 5, 8, … Кожен наступний дорівнює сумі двох попередніх. Перші два - одиниці. Обчислити перші 100 елементів.
Створити послідовність за попереднім правилом для початкових чисел 1, 3.
Перевірити що \(n^3 + (n+1)^3 + (n+2)^3\) ділиться на 9.
Створити послідовність чисел, що діляться на 3 або 7 або 9 без залишку.
phib <- function(x,n){
x[n] <- x[n- 1] + x[n - 2]
x
}
phib_seq <- function(n){
x <- rep(1,n)
for (i in 3:n){
x <- phib(x,i)
}
x
}
vast=function(n){
x = c(1,1)
for(i in 3:n) x[i] = x[i-1] + x[i-2]
return(x)}
Фактори необхідні для роботи з даними. Вони використовуються для представлення категоріальних даних :)
Приклад: тест
x <- c("так","так","ні","ні","ні","ні","так","ні")
class(x) # тип вектора
str(x) # структура
length(x) # довжина
unique(x) # унікальні значення
Але це ж просто відповіді на питання - є два варіанти - так і ні
x <- factor(x)
class(x)
str(x)
length(x)
unique(x)
Тепер можна обчислювати кількість
table(x)
## x
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## 91 92 93 94 95 96 97 98 99 100
## 1 1 1 1 1 1 1 1 1 1
summary(x)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.00 25.75 50.50 50.50 75.25 100.00
Згенерувати вектор з “так” і “ні”. Як це зробити?
Випадковість і ймовірність.
sample(x, size, replace = FALSE, prob = NULL)
- x вектор або число
- n число, кількість потрібних елементів
- replace чи можна повторювати значення?
- prob вектор ймовірностей для отримання елементів.
x <- sample(1:100,5) # 5 випадкових чисел з проміжку 1 - 100
x <- sample(c("так","ні"),100,replace = TRUE) # 100 випадкових відповідей так ні
y <- sample(c("чоловік","жінка"),100,replace = TRUE,prob = c(0.7,0.3))
порахуємо кількість так і ні
z <- table(x,y) # таблиця з частотами появи елементів
prop.table(z) # пропорційні частки
## y
## x жінка чоловік
## ні 0.13 0.36
## так 0.18 0.33
mosaicplot(z,color = TRUE)
mosaicplot(z,
main="Наша табличка",
xlab="Відповідь",
ylab="Стать",
color = "blue")
Вектори незалежно від типу є послідовностями даних. Але дані, як правило мають певну структуру. Як правило, це таблиця з рядками, які відповідають спостереженням. Кожне спостереження містить декілька змінних. Такі структури в R називаються датафреймами (Data frames).
df <- data.frame(a = 1:4, b = letters[1:4])
df
## a b
## 1 1 a
## 2 2 b
## 3 3 c
## 4 4 d
survey <- data.frame(y,x)
names(survey) <- c("Стать","Ви п'єте каву з молоком?")
z <- sample(c("Jacobs","Lavazza","Nescafe","Ambassador","Chibo"),100,replace = TRUE)
survey$temp <- z
names(survey) <- c("Стать","Ви п'єте каву з молоком?", "Ваша улюблена кава")
наступні функції корисні для роботи з датафреймами
str(df)
## 'data.frame': 4 obs. of 2 variables:
## $ a: int 1 2 3 4
## $ b: Factor w/ 4 levels "a","b","c","d": 1 2 3 4
summary(df)
## a b
## Min. :1.00 a:1
## 1st Qu.:1.75 b:1
## Median :2.50 c:1
## Mean :2.50 d:1
## 3rd Qu.:3.25
## Max. :4.00
наступні функції корисні для роботи з датафреймами
class(df)
## [1] "data.frame"
df$a
## [1] 1 2 3 4
Скільки чоловіків п’ють каву з молоком?
Скільки жінок люблять каву Аmbassador?
Який відсоток людей любить п’ють каву з молоком?
Які долі популярності кожної кавової марки?
population <- read.csv("/home/oleksii/MyCode/R/BrovaryLectures/Data/population-for-ukraine.csv")
head(population)
## Year Population.for.Ukraine
## 1 1990 51.370
## 2 1991 51.361
## 3 1992 51.314
## 4 1993 51.217
## 5 1994 51.053
## 6 1995 50.812
names(population)
## [1] "Year" "Population.for.Ukraine"
names(population) <- c("Рік","Населення")
plot(population)
plot(population, type = "l")
Звернення до елементів
population[1,1]
## [1] 1990
population[1,2]
## [1] 51.37
population[1,]
## Рік Населення
## 1 1990 51.37
population[2,]
## Рік Населення
## 2 1991 51.361
population[,1]
## [1] 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003
## [15] 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014
population[,2]
## [1] 51.370 51.361 51.314 51.217 51.053 50.812 50.490 50.096 49.655 49.197
## [11] 48.746 48.311 47.891 47.494 47.127 46.795 46.503 46.249 46.028 45.831
## [21] 45.647 45.478 45.320 45.165 45.002
population[,"Рік"]
## [1] 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003
## [15] 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014
population$Рік
## [1] 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003
## [15] 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014
population2 <- read.csv("/home/oleksii/MyCode/R/BrovaryLectures/Data/population-for-ukraine2.csv", stringsAsFactors = FALSE)
head(population2)
## X1990 X51891400
## 1 1991 52000500
## 2 1992 52150400
## 3 1993 52179200
## 4 1994 51921400
## 5 1995 51512800
## 6 1996 51057800
names(population2) <- c("Рік","Населення")
population2$Населення <- population2$Населення/1000000
давайте придумаємо як знайти інформацію, яка нам потрібна?
population3 <- merge.data.frame(population,population2, all = TRUE,by = "Рік")
plot(population3$Рік,population3$Населення.x,type="l",col="red")
lines(population3$Рік,population3$Населення.y,col="green")
попередній графік трохи не потрапляв у границі
population3 <- merge.data.frame(population,population2, all = TRUE,by = "Рік")
plot(population3$Рік,population3$Населення.y,type="l",col="red")
lines(population3$Рік,population3$Населення.x,col="green")
Більшість датасетів має відсутні дані. Відсутні дані в R позначаються NA (not available).
Важливо зрозуміти як R опрацьовує відсутні дані.
NA + 5
## [1] NA
NA == NA
## [1] NA
NA != NA
## [1] NA
is.na(NA)
## [1] TRUE
is.na(4)
## [1] FALSE
v <- c(1,NA,2)
sum(v)
## [1] NA
kids <- read.csv("/home/oleksii/MyCode/R/BrovaryLectures/Data/kids_H_W.csv", stringsAsFactors = FALSE)
head(kids)
## Index Height.Inches. Weight.Pounds.
## 1 1 65.78331 112.9925
## 2 2 71.51521 136.4873
## 3 3 69.39874 153.0269
## 4 4 68.21660 142.3354
## 5 5 67.78781 144.2971
## 6 6 68.69784 123.3024
Виміри у дюймах та фунтах. Жах
Завдання: створити функцію, що переводить дюйми у сантиметри, а фунти у кілограми та застосувати її до датасету.
plot(kids[-1])
Зробити виміри своєї сім’ї та внести їх до датафрейму.
Виділити іншим коліром ваші точки щоб зрозуміти де ви у цій множині.
Імпортувати датасети для країн світу та міст.
Завдання: 3.1. Написати три питання, які можна задати спеціалісту з даних з приводу цих даних? 3.2. Написати функцію, яка за назвою міста знаходить країну. 3.3. Написати функцію, яка повертає всі міста для заданох країни.