Вводное занятие по R.

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

5 + 12
## [1] 17
25 - 16
## [1] 9
40 - 123
## [1] -83
3 * 5
## [1] 15
45 / 5
## [1] 9

Присваивание и операции с переменными

var1  <- 42
var2  <- 35.25

var1
## [1] 42
var2
## [1] 35.25
var1 + 100
## [1] 142
var1 + var2 - 12
## [1] 65.25
var3  <- var1^2 + var2^2
var3
## [1] 3006.562

Логические операторы

var3 > 200
## [1] TRUE
var3 > 3009
## [1] FALSE
var1 == var2
## [1] FALSE
var1 != var2
## [1] TRUE
var3 >= 200
## [1] TRUE
var3 <= 200
## [1] FALSE
new_var  <- var1 == var2
new_var
## [1] FALSE

Векторы

Создать вектор от 1 до 67

1:67
##  [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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

Записать вектор от 1 до 67 в переменную

vector1  <- 1:67
vector1
##  [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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

Создать вектор с произвольными числами

vector2  <- c(-32, 45, 67, 12.78, 129, 0, -65)

Обращение к отдельным элементам вектора

vector1[1] # обращение к первому элементу вектора vector1
## [1] 1
vector1[3] # обращение к третьему элементу вектора vector1
## [1] 3
vector2[c(1,2,3)]   # обращение к первому, второму и третьему элементам вектора vector2
## [1] -32  45  67
vector2[1:3]        # обращение к элементам с первого по третий вектора vector2
## [1] -32  45  67
vector2[c(1,5,6,7,10)] # элемента №10 в векторе vector2 нет, поэтому выводится NA
## [1] -32 129   0 -65  NA

Манипуляции с векторами

vector1 + 10 # увеличение вектора vector1 на 10 (каждое значение вектора увеличивается на 10)
##  [1] 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
## [24] 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
## [47] 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
vector2 + 56 
## [1]  24.00 101.00 123.00  68.78 185.00  56.00  -9.00
vector2 == 0 # проверка каждого элемента вектора на равенство с нулём (результат - вектор с логическими значениями)
## [1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
vector1 > 30 # сравнение каждого элемента вектора с 30 (результат - вектор с логическими значениями)
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE
## [34]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [45]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [56]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [67]  TRUE
x <- 23 # тоже самое с переменными
x == 23
## [1] TRUE
vector2 > 0
## [1] FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
vector2[vector2 > 0]    #обращение только к тем элементам вектора, которые больше 0
## [1]  45.00  67.00  12.78 129.00
vector2[vector2 < 0]    #обращение только к тем элементам вектора, которые меньше 0
## [1] -32 -65
vector2[vector2 == 0]   #обращение только к тем элементам вектора, которые равны 0
## [1] 0
vector1[vector1 > 20 & vector1 < 30]   #обращение только к тем элементам вектора, которые соответствуют сразу двум условиям
## [1] 21 22 23 24 25 26 27 28 29
vector1[vector1 > 60 | vector1 < 10]   #обращение только к тем элементам вектора, которые соответствуют хотя бы одному из двух условий
##  [1]  1  2  3  4  5  6  7  8  9 61 62 63 64 65 66 67
numbers  <- vector1[vector1 > 20 & vector1 < 30]
positive_numbers  <- vector2[vector2 > 0]
v1  <- c(165, 178, 180, 181, 167, 178, 187, 167, 187)
mean_v1  <- mean(v1) # среднее значения для элементов вектора v1
mean_v1
## [1] 176.6667
v1[v1 > mean_v1] # отобрать только элементы вектора v1, которые больше среднего значения
## [1] 178 180 181 178 187 187
greater_than_mean  <- v1[v1 > mean_v1]
greater_than_mean
## [1] 178 180 181 178 187 187

Dataframes

Создадим набор данных из 4 переменных. Для этого сначала создадим 4 переменные.

name <- c('Виктор', 'Олег', 'Анна', 'Елена', 'Мария')
sex <- c('male', 'male', 'female', 'female', 'female')
age <- c(17, 18, 22, 20, 21)
R_group <- c(T, F, T, T, F)

Теперь объединим их в единый набора данных (матрица данных, dataframe)

data  <- data.frame(Name=name, Sex=sex, Age=age, R_fan=R_group)   # создадим data frame из этих переменных
str(data)  # посмотрим на структуру
## 'data.frame':    5 obs. of  4 variables:
##  $ Name : Factor w/ 5 levels "Анна","Виктор",..: 2 5 1 3 4
##  $ Sex  : Factor w/ 2 levels "female","male": 2 2 1 1 1
##  $ Age  : num  17 18 22 20 21
##  $ R_fan: logi  TRUE FALSE TRUE TRUE FALSE
data     # посмотрим на сами данные
##     Name    Sex Age R_fan
## 1 Виктор   male  17  TRUE
## 2   Олег   male  18 FALSE
## 3   Анна female  22  TRUE
## 4  Елена female  20  TRUE
## 5  Мария female  21 FALSE

Отбор переменны

mean(data$Age) # среднее значение возраста
## [1] 19.6
table(data$Sex) # количество мужчин и женщин (частота значений категориальной переменной)
## 
## female   male 
##      3      2
male <- subset(data, Sex == 'male') # выбрать только мужчин
male
##     Name  Sex Age R_fan
## 1 Виктор male  17  TRUE
## 2   Олег male  18 FALSE
names_only <- data[,1] # выбрать только переменную с именами
names_only
## [1] Виктор Олег   Анна   Елена  Мария 
## Levels: Анна Виктор Елена Мария Олег
Viktor_only <- data[1,] # выбрать значения всех переменных только для Виктора
Viktor_only
##     Name  Sex Age R_fan
## 1 Виктор male  17  TRUE
data[1,2] # выбрать конкретную ячейку
## [1] male
## Levels: female male

Открытие данных

Для того, чтобы открывать данные разных форматов, нужно скачать и активировать пакет foreign. Чтобы скачать пакет, воспользуйтесь командой install.packages().

#install.packages('foreign')
require(foreign)
## Loading required package: foreign

.txt format

mtcars_from_desktop <- read.table("mtcars_data.txt", header = TRUE)
str(mtcars_from_desktop)
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : int  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : int  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : int  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : int  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: int  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: int  4 4 1 1 2 1 4 2 2 4 ...
summary(mtcars_from_desktop)
##       mpg             cyl             disp             hp       
##  Min.   :10.40   Min.   :4.000   Min.   : 71.1   Min.   : 52.0  
##  1st Qu.:15.43   1st Qu.:4.000   1st Qu.:120.8   1st Qu.: 96.5  
##  Median :19.20   Median :6.000   Median :196.3   Median :123.0  
##  Mean   :20.09   Mean   :6.188   Mean   :230.7   Mean   :146.7  
##  3rd Qu.:22.80   3rd Qu.:8.000   3rd Qu.:326.0   3rd Qu.:180.0  
##  Max.   :33.90   Max.   :8.000   Max.   :472.0   Max.   :335.0  
##       drat             wt             qsec             vs        
##  Min.   :2.760   Min.   :1.513   Min.   :14.50   Min.   :0.0000  
##  1st Qu.:3.080   1st Qu.:2.581   1st Qu.:16.89   1st Qu.:0.0000  
##  Median :3.695   Median :3.325   Median :17.71   Median :0.0000  
##  Mean   :3.597   Mean   :3.217   Mean   :17.85   Mean   :0.4375  
##  3rd Qu.:3.920   3rd Qu.:3.610   3rd Qu.:18.90   3rd Qu.:1.0000  
##  Max.   :4.930   Max.   :5.424   Max.   :22.90   Max.   :1.0000  
##        am              gear            carb      
##  Min.   :0.0000   Min.   :3.000   Min.   :1.000  
##  1st Qu.:0.0000   1st Qu.:3.000   1st Qu.:2.000  
##  Median :0.0000   Median :4.000   Median :2.000  
##  Mean   :0.4062   Mean   :3.688   Mean   :2.812  
##  3rd Qu.:1.0000   3rd Qu.:4.000   3rd Qu.:4.000  
##  Max.   :1.0000   Max.   :5.000   Max.   :8.000
# ?read.table  # см справку про функцию  read.table

SPSS format (*.sav)

mtcars_from_spss <- read.spss("my_mtcars.sav", use.value.labels = F, to.data.frame = T, use.missings = T)
## Warning in read.spss("my_mtcars.sav", use.value.labels = F, to.data.frame
## = T, : my_mtcars.sav: Unrecognized record type 7, subtype 18 encountered in
## system file
str(mtcars_from_spss)
## 'data.frame':    32 obs. of  12 variables:
##  $ cars: Factor w/ 32 levels "AMC Javelin        ",..: 18 19 5 13 14 31 7 21 20 22 ...
##  $ mpg : Factor w/ 25 levels "10.4","13.3",..: 16 16 19 17 13 12 3 20 19 14 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: Factor w/ 27 levels "108  ","120.1",..: 8 8 1 11 18 10 18 7 5 9 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: Factor w/ 22 levels "2.76","2.93",..: 16 16 15 5 6 1 7 11 17 17 ...
##  $ wt  : Factor w/ 29 levels "1.513","1.615",..: 9 12 7 16 18 19 21 15 13 18 ...
##  $ qsec: Factor w/ 30 levels "14.5 ","14.6 ",..: 6 10 22 24 10 29 5 27 30 19 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
##  - attr(*, "variable.labels")= Named chr  "" "Miles/(US) gallon" "Number of cylinders" "Displacement (cu.in.)" ...
##   ..- attr(*, "names")= chr  "cars" "mpg" "cyl" "disp" ...
##  - attr(*, "codepage")= int 65001
summary(mtcars_from_spss)
##                   cars         mpg          cyl             disp   
##  AMC Javelin        : 1   10.4   : 2   Min.   :4.000   275.8  : 3  
##  Cadillac Fleetwood : 1   15.2   : 2   1st Qu.:4.000   160    : 2  
##  Camaro Z28         : 1   19.2   : 2   Median :6.000   167.6  : 2  
##  Chrysler Imperial  : 1   21     : 2   Mean   :6.188   360    : 2  
##  Datsun 710         : 1   21.4   : 2   3rd Qu.:8.000   108    : 1  
##  Dodge Challenger   : 1   22.8   : 2   Max.   :8.000   120.1  : 1  
##  (Other)            :26   (Other):20                   (Other):21  
##        hp             drat          wt          qsec          vs        
##  Min.   : 52.0   3.07   : 3   3.44   : 3   17.02  : 2   Min.   :0.0000  
##  1st Qu.: 96.5   3.92   : 3   3.57   : 2   18.9   : 2   1st Qu.:0.0000  
##  Median :123.0   2.76   : 2   1.513  : 1   14.5   : 1   Median :0.0000  
##  Mean   :146.7   3.08   : 2   1.615  : 1   14.6   : 1   Mean   :0.4375  
##  3rd Qu.:180.0   3.15   : 2   1.835  : 1   15.41  : 1   3rd Qu.:1.0000  
##  Max.   :335.0   3.9    : 2   1.935  : 1   15.5   : 1   Max.   :1.0000  
##                  (Other):18   (Other):23   (Other):24                   
##        am              gear            carb      
##  Min.   :0.0000   Min.   :3.000   Min.   :1.000  
##  1st Qu.:0.0000   1st Qu.:3.000   1st Qu.:2.000  
##  Median :0.0000   Median :4.000   Median :2.000  
##  Mean   :0.4062   Mean   :3.688   Mean   :2.812  
##  3rd Qu.:1.0000   3rd Qu.:4.000   3rd Qu.:4.000  
##  Max.   :1.0000   Max.   :5.000   Max.   :8.000  
## 
# ?read.spss   # см справку про функцию  read.spss

Проверка загрузки данных

head(mtcars_from_desktop, 3) # посмотреть первые 3 наблюдения
##                mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4     21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710    22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
tail(mtcars_from_desktop)    # посмотреть посление наблюдения
##                 mpg cyl  disp  hp drat    wt qsec vs am gear carb
## Porsche 914-2  26.0   4 120.3  91 4.43 2.140 16.7  0  1    5    2
## Lotus Europa   30.4   4  95.1 113 3.77 1.513 16.9  1  1    5    2
## Ford Pantera L 15.8   8 351.0 264 4.22 3.170 14.5  0  1    5    4
## Ferrari Dino   19.7   6 145.0 175 3.62 2.770 15.5  0  1    5    6
## Maserati Bora  15.0   8 301.0 335 3.54 3.570 14.6  0  1    5    8
## Volvo 142E     21.4   4 121.0 109 4.11 2.780 18.6  1  1    4    2

Манипулиции с переменными

mtcars$mpg
##  [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2
## [15] 10.4 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4
## [29] 15.8 19.7 15.0 21.4
summary(mtcars$mpg)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   10.40   15.42   19.20   20.09   22.80   33.90
mtcars$kml <- 0.425143707 * mtcars$mpg    # from 'mpg-US' to 'km/l'
mtcars$kml
##  [1]  8.928018  8.928018  9.693277  9.098075  7.950187  7.695101  6.079555
##  [8] 10.373506  9.693277  8.162759  7.567558  6.972357  7.354986  6.462184
## [15]  4.421495  4.421495  6.249612 13.774656 12.924369 14.412372  9.140590
## [22]  6.589727  6.462184  5.654411  8.162759 11.606423 11.053736 12.924369
## [29]  6.717271  8.375331  6.377156  9.098075
mtcars$number <- 1:nrow(mtcars)
mtcars$number
##  [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
nrow(mtcars) # количество строк (наблюдений)
## [1] 32
ncol(mtcars) # количество столбиков (переменных)
## [1] 13

Отбор части данных

mtcars$mpg[1:10] # показать только первые 10 значений переменной mpg
##  [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2
mtcars[1,1] # показать значение из первого столбика и первой строки
## [1] 21
mtcars[c(2,10,30),1] # показать только 2, 10 и 30 значения из столбика 1
## [1] 21.0 19.2 19.7
mtcars[10:20,1] # показать с 10 по 20 значения из столбика 1
##  [1] 19.2 17.8 16.4 17.3 15.2 10.4 10.4 14.7 32.4 30.4 33.9
mtcars[5,]  # показать ряд № 5
##                    mpg cyl disp  hp drat   wt  qsec vs am gear carb
## Hornet Sportabout 18.7   8  360 175 3.15 3.44 17.02  0  0    3    2
##                        kml number
## Hornet Sportabout 7.950187      5
mtcars[,1]  # показать строку № 1
##  [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2
## [15] 10.4 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4
## [29] 15.8 19.7 15.0 21.4

Отбор части данных с помощью условия

mtcars$cyl
##  [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
mtcars$cyl == '6'
##  [1]  TRUE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE
## [12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
head(subset(mtcars, cyl == '6'))
##                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4      21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Valiant        18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
## Merc 280       19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
## Merc 280C      17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
##                     kml number
## Mazda RX4      8.928018      1
## Mazda RX4 Wag  8.928018      2
## Hornet 4 Drive 9.098075      4
## Valiant        7.695101      6
## Merc 280       8.162759     10
## Merc 280C      7.567558     11
head(subset(mtcars, mpg > 20))
##                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4      21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710     22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Merc 240D      24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230       22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
##                      kml number
## Mazda RX4       8.928018      1
## Mazda RX4 Wag   8.928018      2
## Datsun 710      9.693277      3
## Hornet 4 Drive  9.098075      4
## Merc 240D      10.373506      8
## Merc 230        9.693277      9