Язык R

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

Лекция 2

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

8 сентября 2023

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

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

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"

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"

Пакет пакетов

Забудьте все, чему вас учили…

Пакеты - репозитории

Пакеты - полезные команды

remove.packages("packagename") - удалить пакет

update.packages() - обновить все пакеты

library() - список доступных пакетов

library("packagename") - загрузить установленный пакет в текущую R сессию

vignette("packagename") - посмотреть “красивый” мануал по пакету, есть не для всех пакетов

Пакеты

  • Установить пакет нужно один раз, но подгружать при каждом запуске рабочего сеанса

  • После утановки нужно только подгрузить пакет с помощью library("packagename")

tidyverse

install.packages("tidyverse")

library(tidyverse)

https://www.tidyverse.org/

library(tidyverse)
tidyverse_packages()
 [1] "broom"         "conflicted"    "cli"           "dbplyr"       
 [5] "dplyr"         "dtplyr"        "forcats"       "ggplot2"      
 [9] "googledrive"   "googlesheets4" "haven"         "hms"          
[13] "httr"          "jsonlite"      "lubridate"     "magrittr"     
[17] "modelr"        "pillar"        "purrr"         "ragg"         
[21] "readr"         "readxl"        "reprex"        "rlang"        
[25] "rstudioapi"    "rvest"         "stringr"       "tibble"       
[29] "tidyr"         "xml2"          "tidyverse"    

tibble

tibble

  • Похоже на data.frame

  • Ведут себя более предсказуемо и удобно

  • При работе с данными с помощью коллекции пакетов tidyverse в большинстве случаев на выходе получается tibble

tibble - Создание

tibble(
  x = 1:5,
  y = 1,
  `1z b` = x^2 + y
)
# A tibble: 5 × 3
      x     y `1z b`
  <int> <dbl>  <dbl>
1     1     1      2
2     2     1      5
3     3     1     10
4     4     1     17
5     5     1     26

tibble - Особенности

  • Не преобразует строки в факторы

  • Не изменяет имена переменных

  • Можно (но нужно ли?) использовать “недопустимые” имена столбцов

  • Выводит информацию о размере выводимого фрейма и типе данных в столбцах

  • Позволяет ссылаться на только что созданные переменные

Создание: tribble

tribble(
  ~x,~y,~z,
  "a",2,3.6,
  "b",5,1.0
)
# A tibble: 2 × 3
  x         y     z
  <chr> <dbl> <dbl>
1 a         2   3.6
2 b         5   1  

data.frame to tibble

Базовая таблица (data.frame)

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

Создание: as_tibble

as_tibble(iris)
# A tibble: 150 × 5
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
          <dbl>       <dbl>        <dbl>       <dbl> <fct>  
 1          5.1         3.5          1.4         0.2 setosa 
 2          4.9         3            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           3.6          1.4         0.2 setosa 
 6          5.4         3.9          1.7         0.4 setosa 
 7          4.6         3.4          1.4         0.3 setosa 
 8          5           3.4          1.5         0.2 setosa 
 9          4.4         2.9          1.4         0.2 setosa 
10          4.9         3.1          1.5         0.1 setosa 
# ℹ 140 more rows

Выведет только 10 первых строк и помещающиеся столбцы, а не “простыню”

dplyr

dplyr

https://dplyr.tidyverse.org/reference/index.html

  • Очень много разных функций

  • У каждой функции очень много разных опций

  • Разберем только некоторые наиболее употребимые

filter()

Фильтрация строк по условию

nrow(starwars)
[1] 87
a <- filter(starwars, height > 150)
head(a, 3)
# A tibble: 3 × 14
  name      height  mass hair_color skin_color eye_color birth_year sex   gender
  <chr>      <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
1 Luke Sky…    172    77 blond      fair       blue            19   male  mascu…
2 C-3PO        167    75 <NA>       gold       yellow         112   none  mascu…
3 Darth Va…    202   136 none       white      yellow          41.9 male  mascu…
# ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
#   vehicles <list>, starships <list>
nrow(a)
[1] 69

Удобно обращаться к столбцам!!!

select()

Выбор столбцов по индексам

colnames(starwars)
 [1] "name"       "height"     "mass"       "hair_color" "skin_color"
 [6] "eye_color"  "birth_year" "sex"        "gender"     "homeworld" 
[11] "species"    "films"      "vehicles"   "starships" 
select(starwars, 1:3) #выбрать столбцы с первого по третий
# A tibble: 87 × 3
   name               height  mass
   <chr>               <int> <dbl>
 1 Luke Skywalker        172    77
 2 C-3PO                 167    75
 3 R2-D2                  96    32
 4 Darth Vader           202   136
 5 Leia Organa           150    49
 6 Owen Lars             178   120
 7 Beru Whitesun lars    165    75
 8 R5-D4                  97    32
 9 Biggs Darklighter     183    84
10 Obi-Wan Kenobi        182    77
# ℹ 77 more rows

select()

Выбор столбцов по имени

select(starwars, name, hair_color, eye_color)
# A tibble: 87 × 3
   name               hair_color    eye_color
   <chr>              <chr>         <chr>    
 1 Luke Skywalker     blond         blue     
 2 C-3PO              <NA>          yellow   
 3 R2-D2              <NA>          red      
 4 Darth Vader        none          yellow   
 5 Leia Organa        brown         brown    
 6 Owen Lars          brown, grey   blue     
 7 Beru Whitesun lars brown         blue     
 8 R5-D4              <NA>          red      
 9 Biggs Darklighter  black         brown    
10 Obi-Wan Kenobi     auburn, white blue-gray
# ℹ 77 more rows

Конец!