Язык R

и его применение в биоинформатике

Лекция 1 - на дом

Анастасия Жарикова

6 сентября 2024

С чем мы работаем и где находимся?

getwd() # узнать рабочую директорию

setwd("path/to/Newdir") # задать рабочую директорию

dir() # список файлов в рабочей директории

dir.create("New_dir") # создать директорию New_dir

dir.exists("Dir") # проверить, существует ли директория Dir

unlink("Dir", recursive = T) # удалить директорию Dir

file.exists("file.txt") # проверить, существует ли файл file.txt

file.remove("file.txt") # удалить файл file.txt

sessionInfo() # информация о загруженной сессии R

Информация о загруженной сессии R

Знать версии программ и пакетов необходимо для возможности воспроизведения результатов

sessionInfo()
R version 4.3.2 (2023-10-31 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19045)

Matrix products: default


locale:
[1] LC_COLLATE=Russian_Russia.utf8  LC_CTYPE=Russian_Russia.utf8   
[3] LC_MONETARY=Russian_Russia.utf8 LC_NUMERIC=C                   
[5] LC_TIME=Russian_Russia.utf8    

time zone: Europe/Moscow
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
 [1] htmlwidgets_1.6.4 compiler_4.3.2    fastmap_1.1.1     cli_3.6.1        
 [5] tools_4.3.2       htmltools_0.5.7   rstudioapi_0.15.0 yaml_2.3.8       
 [9] rmarkdown_2.26    knitr_1.45        jsonlite_1.8.8    xfun_0.42        
[13] digest_0.6.34     rlang_1.1.2       evaluate_0.23    

Справки и помощь

  • ?seq
  • help(seq)
  • example(seq)

Cheat Sheets

Вектор

Основной тип данных

Индексация начинается с 1!!!

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

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

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

Функция с() 🏠

c(1, 2, 3)
[1] 1 2 3

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

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

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

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(from = 1, to = 8, by = 2)
[1] 1 3 5 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

Взять 10 случайных чисел 🏠

от 1 до 30

sample(1:30, 10, replace = T)
 [1] 22 21  8 18 17 23 28 22  7 26
sample(1:30, 10, replace = T)
 [1]  6 24 26 16  2 17 22 24  8 30
set.seed(123)
sample(1:30, 10, replace = T)
 [1] 15 19 14  3 10 18 22 11  5 20
set.seed(123)
sample(1:30, 10, replace = T)
 [1] 15 19 14  3 10 18 22 11  5 20

set.seed(), sample() 🏠

Получить числа из известного распределения 🏠

  • rnorm(n, mean, sd) - нормальное распределение
  • runif(n, min, max) - равномерное распределение
  • rbinom(n, size, prob) - биномиальное распределение
  • rpois(n, lambda) - распределение Пуассона
set.seed(123)
rpois(20,10)
 [1]  8  9 14 10 10 15 11  5  4 13 11 11 10  8 15 11  3  7  6  8

Немного о функциях

Разберем функцию rnorm

В вкладке “Help” можно вызвать справочную информацию о функции

rnorm(n, mean = 0, sd = 1)

У функции есть параметры с значениями по умолчанию

set.seed(123)
rnorm(3) # получим 3 случайных значения из стандартного нормального распределения
[1] -0.5604756 -0.2301775  1.5587083

Немного о функциях

set.seed(123)
rnorm(3, mean = 1, sd = 2) # указываем значения параметров
[1] -0.1209513  0.5396450  4.1174166
set.seed(123)
rnorm(3, 1, 2) # чаще всего можно не указывать имена параметров в явном виде 
[1] -0.1209513  0.5396450  4.1174166

Вектор - данные одного типа 🏠

x <- c(0.5, 1.2, 3.6) # точка - разделитель разрядов
typeof(x) # double or numeric
[1] "double"
x <- c(5, 2, 3)
typeof(x) # double
[1] "double"
x <- 1:5
typeof(x) # integer  
[1] "integer"
x <- c(T,F,F,T) 
typeof(x) # logical  
[1] "logical"
x <- c('a','b','c')
typeof(x) # character 
[1] "character"

Таблица

Где тут вектора?

Приведение типов 🏠

x <- c(F, 1, 2, T)
typeof(x)
[1] "double"
x 
[1] 0 1 2 1
x <- c(1, 2.8)
typeof(x) 
[1] "double"
x 
[1] 1.0 2.8
x <- c(1, 'a', F, 5.5)
typeof(x) 
[1] "character"
x 
[1] "1"     "a"     "FALSE" "5.5"  

Преобразование типов 🏠

x <- c(F, F, T, T)
x
[1] FALSE FALSE  TRUE  TRUE
typeof(x)
[1] "logical"
x 
[1] FALSE FALSE  TRUE  TRUE
x <- as.numeric(x)
typeof(x) 
[1] "double"
x 
[1] 0 0 1 1

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

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"

Вектора 🏠

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

  • значение

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

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

Операции с векторами

x <- c(2, 7, 3, 1)
x + 4
[1]  6 11  7  5

Операции с векторами

x <- c(2, 7, 3, 1)
y <- c(3, 2, 5, 6)
x + y
[1] 5 9 8 7

Операции с векторами

x <- c(2, 7, 3, 1)
y <- c(3, 2)
x + y
[1] 5 9 6 3

Операции с векторами 🏠

x <- 1:5 
x 
[1] 1 2 3 4 5
x+3 
[1] 4 5 6 7 8
y <- 6:10 
y
[1]  6  7  8  9 10
x + y
[1]  7  9 11 13 15
x^2 
[1]  1  4  9 16 25
-x 
[1] -1 -2 -3 -4 -5

Операции с векторами 🏠

x <- 1:5 
x 
[1] 1 2 3 4 5
y <- 1:2 
y
[1] 1 2
x+y
Warning in x + y: длина большего объекта не является произведением длины
меньшего объекта
[1] 2 4 4 6 6

Операции с векторами

x <- 1:6 
x
[1] 1 2 3 4 5 6
x > 4
[1] FALSE FALSE FALSE FALSE  TRUE  TRUE
x >= 4
[1] FALSE FALSE FALSE  TRUE  TRUE  TRUE
x != 4
[1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE
x == 4
[1] FALSE FALSE FALSE  TRUE FALSE FALSE

Получаем логический вектор той же длины!

Операции с векторами 🏠

replace(x, x == 2, 12) 
[1]  1 12  3  4  5  6
x %in% c(1, 4) 
[1]  TRUE FALSE FALSE  TRUE FALSE FALSE
x = 4 
x
[1] 4

Срезы: по индексам

x <- c(5, 16, 8, 32, 56, 2) 
x 
[1]  5 16  8 32 56  2
x[1]  # взять 1ый элемент 
[1] 5
x[2:4] # взять с 2го по 4ый элементы 
[1] 16  8 32
x[c(2, 5)] # взять 2ой и 5ый элементы 
[1] 16 56
x[-1] # без первого элемента 
[1] 16  8 32 56  2

Срезы: по индексам

x > 10  
[1] FALSE  TRUE FALSE  TRUE  TRUE FALSE
x[x > 10] # отобрать элементы больше 10 
[1] 16 32 56
x[x >= 5 & x < 10] # отобрать элементы больше или равные 5 И меньше 10 
[1] 5 8
x[x >= 5 | x < 10] # отобрать элементы больше или равные 5 ИЛИ меньше 10 
[1]  5 16  8 32 56  2
x[2] <- 100 # заменить второй элемент вектора на 100

Срезы: по именам 🏠

x <- c(5,16,8,32,56,2) 
names(x) <- paste('v', 1:length(x), sep = '')
x 
v1 v2 v3 v4 v5 v6 
 5 16  8 32 56  2 
x['v3']  # взять элемент вектора х с именем v3 
v3 
 8 
x[c('v1', 'v3')] 
v1 v3 
 5  8 
x[c(1, 3)] 
v1 v3 
 5  8 

Полезные функции 🏠

x <- 1:6
y <- rep(7, 4)
x
[1] 1 2 3 4 5 6
y
[1] 7 7 7 7
any(x == 5)
[1] TRUE
any(x == 12)
[1] FALSE
all(x == 3)
[1] FALSE
all(y == 7)
[1] TRUE

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,2)
           Fertility Agriculture Examination Education Catholic
Courtelary      80.2        17.0          15        12     9.96
Delemont        83.1        45.1           6         9    84.84
           Infant.Mortality
Courtelary             22.2
Delemont               22.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

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

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

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

Матрицы

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

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

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

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

Данные о качестве воздуха

head(airquality)
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6
dim(airquality)
[1] 153   6
mean(airquality$Ozone)
[1] NA

В чем проблема?

Работа с отсутствующими данными

  • NA - пропущенное значение: is.na()
  • NaN - результат недопустимой арифметической операции: is.nan()
  • NULL - отсутствие субъекта: is.null()

Работа с отсутствующими данными

Не учитывать отсутствующие данные

mean(airquality$Ozone, na.rm = T)
[1] 42.12931

Работа с отсутствующими данными

Удалить строки с отсутствующими данными

Удаляется ВСЯ строка!

dim(airquality)
[1] 153   6
air <- na.omit(airquality)
dim(air)
[1] 111   6
mean(air$Ozone)
[1] 42.0991
mean(airquality$Ozone, na.rm = T)
[1] 42.12931

Работа с отсутствующими данными

air <- head(airquality,10)
is.na(air$Ozone)
 [1] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE
sum(is.na(air$Ozone))
[1] 2
which(is.na(air$Ozone))
[1]  5 10
anyNA(air$Ozone)
[1] TRUE

NaN

0/0
[1] NaN

Удаление столбцов

head(air,3)
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
air$Ozone = NULL
head(air,3)
  Solar.R Wind Temp Month Day
1     190  7.4   67     5   1
2     118  8.0   72     5   2
3     149 12.6   74     5   3

Списки

Списки 🏠

Можно хранить данные разного типа

L <- list("A",c(1,2),30)
L
[[1]]
[1] "A"

[[2]]
[1] 1 2

[[3]]
[1] 30

Списки 🏠

Можно хранить данные разного типа

L1 <- list(L,40)
L1
[[1]]
[[1]][[1]]
[1] "A"

[[1]][[2]]
[1] 1 2

[[1]][[3]]
[1] 30


[[2]]
[1] 40

Списки 🏠

Добавление нового элемента

L[[4]] <- 'new_element'
L
[[1]]
[1] "A"

[[2]]
[1] 1 2

[[3]]
[1] 30

[[4]]
[1] "new_element"

Списки 🏠

Срезы

L # список из 4 элементов
[[1]]
[1] "A"

[[2]]
[1] 1 2

[[3]]
[1] 30

[[4]]
[1] "new_element"
L[3] # список из 1 элемента
[[1]]
[1] 30
L[[3]] # вектор из 1 элемента
[1] 30

Списки 🏠

L1
[[1]]
[[1]][[1]]
[1] "A"

[[1]][[2]]
[1] 1 2

[[1]][[3]]
[1] 30


[[2]]
[1] 40
L1[[1]]
[[1]]
[1] "A"

[[2]]
[1] 1 2

[[3]]
[1] 30

Списки 🏠

L
[[1]]
[1] "A"

[[2]]
[1] 1 2

[[3]]
[1] 30

[[4]]
[1] "new_element"
L1 [[1]]
[[1]]
[1] "A"

[[2]]
[1] 1 2

[[3]]
[1] 30
L1 [[1]] [[2]]
[1] 1 2

Списки 🏠

L <- list(10,20)
L
[[1]]
[1] 10

[[2]]
[1] 20
L$abc <- 123
L
[[1]]
[1] 10

[[2]]
[1] 20

$abc
[1] 123

Списки 🏠

names(L)
[1] ""    ""    "abc"
L[[3]]
[1] 123
L$abc
[1] 123
L[['abc']]
[1] 123

Базовая графика

Точковая диаграмма

head(mtcars, 2)
              mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4      21   6  160 110  3.9 2.620 16.46  0  1    4    4
Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4
plot(mtcars$mpg, mtcars$hp)

Точковая диаграмма - подписи

plot(mtcars$mpg, mtcars$hp,
     main = 'Точечки',
     xlab = 'Miles/(US) gallon', ylab = 'Gross horsepower')

Точковая диаграмма - цвета, размер

plot(mtcars$mpg, mtcars$hp, cex = 2, pch = 16, col = mtcars$cyl,
     cex.lab = 1.5, cex.axis = 2)

Бобры

x <- beaver1[beaver1$day == 346,]
plot(x$time, x$temp)

Линии

plot(x$time, x$temp, type = 'l')

И точки и линии

plot(x$time, x$temp, type = 'o')

Ирисы

head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

Попарные точковые диаграммы

pairs(iris)

Попарные точковые диаграммы - цвета

pairs(iris, col = iris$Species)

Столбчатая диаграмма

table(mtcars$cyl)

 4  6  8 
11  7 14 
barplot(table(mtcars$cyl))

Гистограмма

hist(mtcars$mpg)

Гистограмма - breaks

hist(mtcars$mpg, breaks = 10)

Гистограмма - breaks

hist(mtcars$mpg, breaks = c(10, 20, 25, 30, 35))

Диаграмма размахов

boxplot(iris$Sepal.Length ~ iris$Species)

Циклы

Циклы

Циклы в R медленные!

for

for(year in c(2010:2015)){
  print(paste('The year is', year))
}
[1] "The year is 2010"
[1] "The year is 2011"
[1] "The year is 2012"
[1] "The year is 2013"
[1] "The year is 2014"
[1] "The year is 2015"

for

mt <- mtcars
head(mt,2)
              mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4      21   6  160 110  3.9 2.620 16.46  0  1    4    4
Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4
for(i in 1:nrow(mt)){
  mt$new[i] <- i^2
}
head(mt,4)
                mpg cyl disp  hp drat    wt  qsec vs am gear carb new
Mazda RX4      21.0   6  160 110 3.90 2.620 16.46  0  1    4    4   1
Mazda RX4 Wag  21.0   6  160 110 3.90 2.875 17.02  0  1    4    4   4
Datsun 710     22.8   4  108  93 3.85 2.320 18.61  1  1    4    1   9
Hornet 4 Drive 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1  16

Деление

5/2
[1] 2.5
5%%2
[1] 1

for + if

mt <- mtcars
for(i in 1:nrow(mt)){
  if((i%%2) == 0){
    mt$new[i] = i^2
    mt$type[i] = 'even'
  }
  else{
    mt$new[i] = i^3
    mt$type[i] = 'odd'
  }
}
mt[1:4,(ncol(mt)-5):ncol(mt)]
               vs am gear carb new type
Mazda RX4       0  1    4    4   1  odd
Mazda RX4 Wag   0  1    4    4   4 even
Datsun 710      1  1    4    1  27  odd
Hornet 4 Drive  1  0    3    1  16 even

ifelse

v = c(14,7,6,9,2)
ifelse(v %% 2 == 1,"odd","even")
[1] "even" "odd"  "even" "odd"  "even"

Если у вас только 2 условия на выбор - используйте конструкцию ifelse

for + if + break

x <- 1:5
for(val in x){
if (val == 3){
break
}
print(val)
}
[1] 1
[1] 2

for + if + next

x <- 1:5
for(val in x){
if (val == 3){
next
}
print(val)
}
[1] 1
[1] 2
[1] 4
[1] 5

while

i <- 1
while (i < 6){
  print(i)
  i = i+1
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

Чтение и запись

Сохранение данных

write.table(swiss,file='swiss.tab',quote=T,col.names = T,row.names=T,sep='\t')
write.csv(swiss,file='swiss.csv')
save(swiss,file='swiss.RData')

Чтение данных

mt <- read.table('swiss.tab',sep='\t',header=T)
head(mt)
             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
Neuveville        76.9        43.5          17        15     5.16
Porrentruy        76.1        35.3           9         7    90.57
             Infant.Mortality
Courtelary               22.2
Delemont                 22.2
Franches-Mnt             20.2
Moutier                  20.3
Neuveville               20.6
Porrentruy               26.6

Чтение данных

mt <- read.table('swiss.tab',skip=2)
head(mt)
            V1   V2   V3 V4 V5    V6   V7
1     Delemont 83.1 45.1  6  9 84.84 22.2
2 Franches-Mnt 92.5 39.7  5  5 93.40 20.2
3      Moutier 85.8 36.5 12  7 33.77 20.3
4   Neuveville 76.9 43.5 17 15  5.16 20.6
5   Porrentruy 76.1 35.3  9  7 90.57 26.6
6        Broye 83.8 70.2 16  7 92.85 23.6

Чтение данных

mt <- read.table('swiss.tab', skip=2, header=T)
head(mt)
      Delemont X83.1 X45.1 X6 X9 X84.84 X22.2
1 Franches-Mnt  92.5  39.7  5  5  93.40  20.2
2      Moutier  85.8  36.5 12  7  33.77  20.3
3   Neuveville  76.9  43.5 17 15   5.16  20.6
4   Porrentruy  76.1  35.3  9  7  90.57  26.6
5        Broye  83.8  70.2 16  7  92.85  23.6
6        Glane  92.4  67.8 14  8  97.16  24.9

RData

rm(list=ls())
ls()
character(0)
load('swiss.RData')
ls()
[1] "swiss"

Конец!