Вектори незалежно від типу є послідовностями даних одного типу. Але дані, як правило мають певну структуру. Як правило, це таблиця з рядками, які відповідають спостереженням. Кожне спостереження містить декілька змінних. Такі структури в R називаються датафреймами (Data frames).
Датафрейм це набір векторів, кожен з яких має бути однакової довжини. Виглядає як двовимірна таблиця. Як правило, ми трактуємо датафрейм як спостереження (рядки) певного набору величин (стовпці).
Для створення DF використовується функція data.frame()
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
Давайте створемо датафрейм з відповідями на анкету.
завдання:
1. Потрібно створити датафрейм зі стовпчиками "стать", "Ваша улюблена кава?", "Чи п'єте Ви каву з молоком?", "Скільки чашок кави Ви випиваєте за день?".
2. Створити відповіді на цю анкету - спостереження або рядки нашого датафрейму.
Для створення векторів з даними ми будемо використовувати функцію sample:
sample(x, size, replace = FALSE, prob = NULL)
- x вектор або число
- n число, кількість потрібних елементів
- replace чи можна повторювати значення?
- prob вектор ймовірностей для отримання елементів.
test <- sample(1:100,5) # 5 випадкових чисел з проміжку 1 - 100
test <- sample(1:3,50,replace = TRUE)
підрахувати кількість елементів зі значенням у векторі
використайте функцію table()
Створюємо окремі вектори
x <- sample(c("чоловік","жінка"),100,replace = TRUE,prob = c(0.7,0.3))
y <- sample(c("Jacobs","Lavazza","Nescafe","Ambassador","Chibo"),100,replace = TRUE)
z <- sample(c("так","ні"),100,replace = TRUE)
u <- sample.int(5, 100, replace = TRUE)
Тепер потрібно об’єднати їх у один датафрейм. Для цього є декілька можливостей.
df <- data.frame(x,y)
df$z <- z
df$u <- u
head(df)
## x y z u
## 1 чоловік Ambassador ні 4
## 2 жінка Chibo ні 2
## 3 чоловік Nescafe так 5
## 4 чоловік Nescafe ні 5
## 5 чоловік Lavazza так 4
## 6 чоловік Lavazza ні 2
names(df) <- c("Cтать", "Ваша улюблена кава?", "Чи п'єте Ви каву з молоком?", "Скільки чашок кави Ви випиваєте за день?")
head(df)
## Cтать Ваша улюблена кава? Чи п'єте Ви каву з молоком?
## 1 чоловік Ambassador ні
## 2 жінка Chibo ні
## 3 чоловік Nescafe так
## 4 чоловік Nescafe ні
## 5 чоловік Lavazza так
## 6 чоловік Lavazza ні
## Скільки чашок кави Ви випиваєте за день?
## 1 4
## 2 2
## 3 5
## 4 5
## 5 4
## 6 2
Це зручно для розуміння що означає той чи інший вектор даних, але для програмування краще короткі англійські терміни.
names(df) <- c("x","y","z","u")
subset(df, df$x == "чоловік")
## x y z u
## 1 чоловік Ambassador ні 4
## 3 чоловік Nescafe так 5
## 4 чоловік Nescafe ні 5
## 5 чоловік Lavazza так 4
## 6 чоловік Lavazza ні 2
## 7 чоловік Lavazza так 2
## 8 чоловік Nescafe так 2
## 9 чоловік Chibo ні 5
## 10 чоловік Chibo так 2
## 12 чоловік Jacobs ні 3
## 13 чоловік Nescafe так 1
## 16 чоловік Lavazza ні 2
## 17 чоловік Ambassador ні 5
## 18 чоловік Ambassador ні 3
## 20 чоловік Lavazza так 5
## 22 чоловік Ambassador так 4
## 23 чоловік Jacobs ні 4
## 24 чоловік Lavazza ні 1
## 25 чоловік Nescafe так 5
## 26 чоловік Ambassador ні 4
## 27 чоловік Nescafe ні 3
## 28 чоловік Ambassador ні 4
## 29 чоловік Chibo так 2
## 30 чоловік Ambassador ні 3
## 31 чоловік Chibo так 3
## 33 чоловік Lavazza так 1
## 35 чоловік Chibo так 4
## 36 чоловік Lavazza так 5
## 37 чоловік Chibo так 4
## 38 чоловік Chibo ні 2
## 39 чоловік Jacobs ні 5
## 40 чоловік Jacobs так 3
## 41 чоловік Nescafe так 4
## 42 чоловік Nescafe так 1
## 43 чоловік Nescafe ні 1
## 45 чоловік Nescafe так 3
## 46 чоловік Chibo так 3
## 47 чоловік Lavazza так 5
## 49 чоловік Nescafe так 3
## 52 чоловік Jacobs ні 3
## 54 чоловік Chibo ні 1
## 55 чоловік Chibo так 4
## 59 чоловік Lavazza ні 2
## 60 чоловік Chibo так 1
## 62 чоловік Nescafe так 4
## 63 чоловік Ambassador ні 2
## 64 чоловік Ambassador ні 3
## 65 чоловік Chibo так 2
## 67 чоловік Jacobs так 2
## 68 чоловік Chibo так 1
## 71 чоловік Nescafe так 3
## 72 чоловік Chibo так 2
## 74 чоловік Ambassador так 2
## 75 чоловік Chibo ні 4
## 76 чоловік Nescafe так 2
## 78 чоловік Ambassador ні 3
## 79 чоловік Chibo ні 1
## 80 чоловік Ambassador ні 5
## 81 чоловік Nescafe ні 3
## 83 чоловік Ambassador так 1
## 84 чоловік Lavazza ні 5
## 85 чоловік Chibo так 5
## 86 чоловік Lavazza ні 2
## 87 чоловік Jacobs так 5
## 88 чоловік Chibo так 4
## 90 чоловік Lavazza ні 4
## 91 чоловік Jacobs так 3
## 92 чоловік Chibo ні 3
## 94 чоловік Lavazza ні 1
## 96 чоловік Jacobs так 4
## 98 чоловік Nescafe так 1
## 99 чоловік Nescafe ні 3
## 100 чоловік Jacobs так 5
або можна вибрати всіх людей, що п’ють 5 чашок кави на день
subset(df, u == 5)
## x y z u
## 3 чоловік Nescafe так 5
## 4 чоловік Nescafe ні 5
## 9 чоловік Chibo ні 5
## 17 чоловік Ambassador ні 5
## 20 чоловік Lavazza так 5
## 25 чоловік Nescafe так 5
## 36 чоловік Lavazza так 5
## 39 чоловік Jacobs ні 5
## 47 чоловік Lavazza так 5
## 56 жінка Ambassador ні 5
## 80 чоловік Ambassador ні 5
## 84 чоловік Lavazza ні 5
## 85 чоловік Chibo так 5
## 87 чоловік Jacobs так 5
## 97 жінка Lavazza ні 5
## 100 чоловік Jacobs так 5
Скільки чоловіків п’ють каву з молоком?
Скільки жінок люблять каву Аmbassador?
Скільки людей п’ють більше однієї чашки в день?
Який відсоток людей п’є каву з молоком?
Які долі (відсотки) популярності кожної кавової марки?
plot(df$x)
plot(df$y)
plot(df$y,df$x)
hist(islands)
Побудуємо гістограму кількості чашок кави
hist(df$u)
a <- table(df$y,df$x)
prop.table(a)
##
## жінка чоловік
## Ambassador 0.07 0.13
## Chibo 0.05 0.19
## Jacobs 0.06 0.10
## Lavazza 0.04 0.14
## Nescafe 0.05 0.17
mosaicplot(prop.table(a))
Розглянемо тепер реальні дані: файл coffee.csv
coffee <- read.csv2("/home/oleksii/MyCode/R/BrovaryLectures/Data/coffee.csv")
head(coffee)
## Cups.of.coffee.in.one.week. Cups.of.coffee.outside.home.per.week.
## 1 3 5
## 2 6 4
## 3 14 2
## 4 28 24
## 5 7 0
## 6 15 5
## Taste.Preference Tempature.Preference
## 1 black frozen
## 2 milk/cream hot
## 3 black hot
## 4 milk/cream hot
## 5 milk/cream hot
## 6 milk/cream hot
Який відсоток людей любить гарячу, холодну чи зз льодом?
Побудувати гістограму споживання кави.
Побудувати залежність кількості чашок кави випитих взагалі від кількості чашок кави випитих вдома.
population <- read.csv("/home/oleksii/MyCode/R/BrovaryLectures/Data/population-for-ukraine.csv")
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("Рік","Населення")
Другий спосіб створення датафреймів - функція merge.data.frame() Для використання потрібно викликати функцію для двох датафреймів, які ми хочемо об’єднати, та задати додаткові параметри:
all = TRUE - означає, що ми хочемо об'єднати всі значення першого датафрейму і всі значення другого.
by = "Рік" - це спільний рядок, в результаті буде створено датафрейм в якому є рядок Рік і всі інші з обох датафреймів
population2$Населення <- population2$Населення/1000000
population3 <- merge.data.frame(population,population2, all = TRUE,by = "Рік")
Виконати наступний код і надіслати мені графіки на пошту.
Для датасету animals провести аналіз, який ми вже проходили:
2.1. Знайти максимальні, мінімальні значення.
2.2. Знайти середнє від кожного вектора.
2.3. Створити функцію, яка рахує відношення маси тіла до маси мозку. Обчислити це співідношення для кожної тварини і додати в свій датафрейм (в вашому датафреймі мають бути рядки: animal, body, brain, ratio).
2.4. Побудувати гістограми для ваги тіла і ваги мозку.
2.5. Побудувати графік - залежність між вагою тіла і вагою мозку.
Для отримання датасету з тваринами:
library(MASS)
Animals
## body brain
## Mountain beaver 1.350 8.1
## Cow 465.000 423.0
## Grey wolf 36.330 119.5
## Goat 27.660 115.0
## Guinea pig 1.040 5.5
## Dipliodocus 11700.000 50.0
## Asian elephant 2547.000 4603.0
## Donkey 187.100 419.0
## Horse 521.000 655.0
## Potar monkey 10.000 115.0
## Cat 3.300 25.6
## Giraffe 529.000 680.0
## Gorilla 207.000 406.0
## Human 62.000 1320.0
## African elephant 6654.000 5712.0
## Triceratops 9400.000 70.0
## Rhesus monkey 6.800 179.0
## Kangaroo 35.000 56.0
## Golden hamster 0.120 1.0
## Mouse 0.023 0.4
## Rabbit 2.500 12.1
## Sheep 55.500 175.0
## Jaguar 100.000 157.0
## Chimpanzee 52.160 440.0
## Rat 0.280 1.9
## Brachiosaurus 87000.000 154.5
## Mole 0.122 3.0
## Pig 192.000 180.0
plot(population3$Рік,population3$Населення.x,type="l",col="red")
lines(population3$Рік,population3$Населення.y, col="green")
plot.new()
plot.window(xlim=c(1990, 2016),
ylim = c(0,55))
lines(population3$Рік,population3$Населення.x,type="l",col="red")
lines(population3$Рік,population3$Населення.y,col="green")
axis(1)
axis(2)
box()
title(main = "Населення України",xlab = "Рік", ylab = "Кількість (млн. чол.)")