Язык R

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

Лекция 2

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

13 сентября 2024

В прошлый раз …

… мы познакомились с языком R

Дома вы сделали упражнения на базовый R

Больше нам это не пригодится…

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

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

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

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

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

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

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

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

Пакеты

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

  • После уcтановки нужно только подгрузить пакет с помощью 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

Конвейеры

%>%

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

Подключаем конвейер %>%

library(tidyverse)
starwars %>%
  filter(height > 150)
# A tibble: 69 × 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 Sk…    172    77 blond      fair       blue            19   male  mascu…
 2 C-3PO       167    75 <NA>       gold       yellow         112   none  mascu…
 3 Darth V…    202   136 none       white      yellow          41.9 male  mascu…
 4 Owen La…    178   120 brown, gr… light      blue            52   male  mascu…
 5 Beru Wh…    165    75 brown      light      blue            47   fema… femin…
 6 Biggs D…    183    84 black      light      brown           24   male  mascu…
 7 Obi-Wan…    182    77 auburn, w… fair       blue-gray       57   male  mascu…
 8 Anakin …    188    84 blond      fair       blue            41.9 male  mascu…
 9 Wilhuff…    180    NA auburn, g… fair       blue            64   male  mascu…
10 Chewbac…    228   112 brown      unknown    blue           200   male  mascu…
# ℹ 59 more rows
# ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
#   vehicles <list>, starships <list>

Конвейерный подход

Можно комбинировать все!

starwars %>%
  filter(height > 150, hair_color == "blond") %>%
  slice(1: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 Anakin S…    188    84 blond      fair       blue            41.9 male  mascu…
3 Finis Va…    170    NA blond      fair       blue            91   male  mascu…
# ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
#   vehicles <list>, starships <list>

Удобно разделять шаги по строкам при необходимости

Не стоит записывать весь код в одну длинную строку

Native pipe

|>

starwars |>
  filter(height > 150)
# A tibble: 69 × 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 Sk…    172    77 blond      fair       blue            19   male  mascu…
 2 C-3PO       167    75 <NA>       gold       yellow         112   none  mascu…
 3 Darth V…    202   136 none       white      yellow          41.9 male  mascu…
 4 Owen La…    178   120 brown, gr… light      blue            52   male  mascu…
 5 Beru Wh…    165    75 brown      light      blue            47   fema… femin…
 6 Biggs D…    183    84 black      light      brown           24   male  mascu…
 7 Obi-Wan…    182    77 auburn, w… fair       blue-gray       57   male  mascu…
 8 Anakin …    188    84 blond      fair       blue            41.9 male  mascu…
 9 Wilhuff…    180    NA auburn, g… fair       blue            64   male  mascu…
10 Chewbac…    228   112 brown      unknown    blue           200   male  mascu…
# ℹ 59 more rows
# ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
#   vehicles <list>, starships <list>

Быстрее работает

В примерах данного занятия можно %>% заменить на |>

Есть особенности использования

dplyr

filter() - несколько условий

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

starwars %>%
  filter(height > 150, mass < 100, hair_color == "blond")
# A tibble: 2 × 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 Anakin S…    188    84 blond      fair       blue            41.9 male  mascu…
# ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
#   vehicles <list>, starships <list>

slice() 🏠

Выбор строк по позициям

starwars %>%
  slice(10:20)
# A tibble: 11 × 14
   name     height  mass hair_color skin_color eye_color birth_year sex   gender
   <chr>     <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
 1 Obi-Wan…    182    77 auburn, w… fair       blue-gray       57   male  mascu…
 2 Anakin …    188    84 blond      fair       blue            41.9 male  mascu…
 3 Wilhuff…    180    NA auburn, g… fair       blue            64   male  mascu…
 4 Chewbac…    228   112 brown      unknown    blue           200   male  mascu…
 5 Han Solo    180    80 brown      fair       brown           29   male  mascu…
 6 Greedo      173    74 <NA>       green      black           44   male  mascu…
 7 Jabba D…    175  1358 <NA>       green-tan… orange         600   herm… mascu…
 8 Wedge A…    170    77 brown      fair       hazel           21   male  mascu…
 9 Jek Ton…    180   110 brown      fair       blue            NA   <NA>  <NA>  
10 Yoda         66    17 white      green      brown          896   male  mascu…
11 Palpati…    170    75 grey       pale       yellow          82   male  mascu…
# ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
#   vehicles <list>, starships <list>

slice() 🏠

Выбор строк по позициям

n() - число записей

starwars %>%
  slice((n()-3):n())
# A tibble: 4 × 14
  name      height  mass hair_color skin_color eye_color birth_year sex   gender
  <chr>      <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
1 Rey           NA    NA brown      light      hazel             NA fema… femin…
2 Poe Dame…     NA    NA brown      light      brown             NA male  mascu…
3 BB8           NA    NA none       none       black             NA none  mascu…
4 Captain …     NA    NA none       none       unknown           NA fema… femin…
# ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
#   vehicles <list>, starships <list>

slice_head() 🏠

Вывести первые несколько строк

starwars %>%
  slice_head(n=5)
# A tibble: 5 × 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 R2-D2         96    32 <NA>       white, bl… red             33   none  mascu…
4 Darth Va…    202   136 none       white      yellow          41.9 male  mascu…
5 Leia Org…    150    49 brown      light      brown           19   fema… femin…
# ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
#   vehicles <list>, starships <list>

Base R

Можно комбинировать с командами из базового R

starwars %>% head(4)
# A tibble: 4 × 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 R2-D2         96    32 <NA>       white, bl… red             33   none  mascu…
4 Darth Va…    202   136 none       white      yellow          41.9 male  mascu…
# ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
#   vehicles <list>, starships <list>
starwars %>% head
# A tibble: 6 × 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 R2-D2         96    32 <NA>       white, bl… red             33   none  mascu…
4 Darth Va…    202   136 none       white      yellow          41.9 male  mascu…
5 Leia Org…    150    49 brown      light      brown           19   fema… femin…
6 Owen Lars    178   120 brown, gr… light      blue            52   male  mascu…
# ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
#   vehicles <list>, starships <list>

slice_sample() 🏠

Выбор случайных строк

set.seed(123)
starwars %>%
  slice_sample(n=10)
# A tibble: 10 × 14
   name     height  mass hair_color skin_color eye_color birth_year sex   gender
   <chr>     <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr> 
 1 Qui-Gon…    193    89 brown      fair       blue              92 male  mascu…
 2 Tarfful     234   136 brown      brown      blue              NA male  mascu…
 3 Ki-Adi-…    198    82 white      pale       yellow            92 male  mascu…
 4 Han Solo    180    80 brown      fair       brown             29 male  mascu…
 5 Bail Pr…    191    NA black      tan        brown             67 male  mascu…
 6 Shmi Sk…    163    NA black      fair       brown             72 fema… femin…
 7 Mace Wi…    188    84 none       dark       brown             72 male  mascu…
 8 Darth M…    175    80 none       red        yellow            54 male  mascu…
 9 Rey          NA    NA brown      light      hazel             NA fema… femin…
10 Lobot       175    79 none       light      blue              37 male  mascu…
# ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
#   vehicles <list>, starships <list>

select() 🏠

Выбор колонок по имени

starwars %>%
  select(name,height,mass,hair_color)
# A tibble: 87 × 4
   name               height  mass hair_color   
   <chr>               <int> <dbl> <chr>        
 1 Luke Skywalker        172    77 blond        
 2 C-3PO                 167    75 <NA>         
 3 R2-D2                  96    32 <NA>         
 4 Darth Vader           202   136 none         
 5 Leia Organa           150    49 brown        
 6 Owen Lars             178   120 brown, grey  
 7 Beru Whitesun Lars    165    75 brown        
 8 R5-D4                  97    32 <NA>         
 9 Biggs Darklighter     183    84 black        
10 Obi-Wan Kenobi        182    77 auburn, white
# ℹ 77 more rows

select() 🏠

Выбор колонок по имени

starwars %>%
  select(name:hair_color)
# A tibble: 87 × 4
   name               height  mass hair_color   
   <chr>               <int> <dbl> <chr>        
 1 Luke Skywalker        172    77 blond        
 2 C-3PO                 167    75 <NA>         
 3 R2-D2                  96    32 <NA>         
 4 Darth Vader           202   136 none         
 5 Leia Organa           150    49 brown        
 6 Owen Lars             178   120 brown, grey  
 7 Beru Whitesun Lars    165    75 brown        
 8 R5-D4                  97    32 <NA>         
 9 Biggs Darklighter     183    84 black        
10 Obi-Wan Kenobi        182    77 auburn, white
# ℹ 77 more rows

select() 🏠

Удаление колонок по имени

starwars %>%
  select(-(name:hair_color))
# A tibble: 87 × 10
   skin_color eye_color birth_year sex   gender homeworld species films vehicles
   <chr>      <chr>          <dbl> <chr> <chr>  <chr>     <chr>   <lis> <list>  
 1 fair       blue            19   male  mascu… Tatooine  Human   <chr> <chr>   
 2 gold       yellow         112   none  mascu… Tatooine  Droid   <chr> <chr>   
 3 white, bl… red             33   none  mascu… Naboo     Droid   <chr> <chr>   
 4 white      yellow          41.9 male  mascu… Tatooine  Human   <chr> <chr>   
 5 light      brown           19   fema… femin… Alderaan  Human   <chr> <chr>   
 6 light      blue            52   male  mascu… Tatooine  Human   <chr> <chr>   
 7 light      blue            47   fema… femin… Tatooine  Human   <chr> <chr>   
 8 white, red red             NA   none  mascu… Tatooine  Droid   <chr> <chr>   
 9 light      brown           24   male  mascu… Tatooine  Human   <chr> <chr>   
10 fair       blue-gray       57   male  mascu… Stewjon   Human   <chr> <chr>   
# ℹ 77 more rows
# ℹ 1 more variable: starships <list>

select() + starts_with 🏠

Выбор колонок по имени

iris %>%
  select(starts_with('Sepal')) %>% head(3)
  Sepal.Length Sepal.Width
1          5.1         3.5
2          4.9         3.0
3          4.7         3.2

Аналогично:

starts_with(), ends_with()

select() + contains 🏠

Выбор колонок по имени

iris %>%
  select(contains('Sepal')) %>% head(3)
  Sepal.Length Sepal.Width
1          5.1         3.5
2          4.9         3.0
3          4.7         3.2

select() + matches 🏠

Выбор колонок по имени

iris %>%
  select(matches("^s|s$")) %>% head(3)
  Sepal.Length Sepal.Width Species
1          5.1         3.5  setosa
2          4.9         3.0  setosa
3          4.7         3.2  setosa

pull() 🏠

Выбрать один столбец и взять как вектор

starwars %>%
  select(name) %>% 
  head(3)
# A tibble: 3 × 1
  name          
  <chr>         
1 Luke Skywalker
2 C-3PO         
3 R2-D2         
starwars %>%
  pull(name)
 [1] "Luke Skywalker"        "C-3PO"                 "R2-D2"                
 [4] "Darth Vader"           "Leia Organa"           "Owen Lars"            
 [7] "Beru Whitesun Lars"    "R5-D4"                 "Biggs Darklighter"    
[10] "Obi-Wan Kenobi"        "Anakin Skywalker"      "Wilhuff Tarkin"       
[13] "Chewbacca"             "Han Solo"              "Greedo"               
[16] "Jabba Desilijic Tiure" "Wedge Antilles"        "Jek Tono Porkins"     
[19] "Yoda"                  "Palpatine"             "Boba Fett"            
[22] "IG-88"                 "Bossk"                 "Lando Calrissian"     
[25] "Lobot"                 "Ackbar"                "Mon Mothma"           
[28] "Arvel Crynyd"          "Wicket Systri Warrick" "Nien Nunb"            
[31] "Qui-Gon Jinn"          "Nute Gunray"           "Finis Valorum"        
[34] "Padmé Amidala"         "Jar Jar Binks"         "Roos Tarpals"         
[37] "Rugor Nass"            "Ric Olié"              "Watto"                
[40] "Sebulba"               "Quarsh Panaka"         "Shmi Skywalker"       
[43] "Darth Maul"            "Bib Fortuna"           "Ayla Secura"          
[46] "Ratts Tyerel"          "Dud Bolt"              "Gasgano"              
[49] "Ben Quadinaros"        "Mace Windu"            "Ki-Adi-Mundi"         
[52] "Kit Fisto"             "Eeth Koth"             "Adi Gallia"           
[55] "Saesee Tiin"           "Yarael Poof"           "Plo Koon"             
[58] "Mas Amedda"            "Gregar Typho"          "Cordé"                
[61] "Cliegg Lars"           "Poggle the Lesser"     "Luminara Unduli"      
[64] "Barriss Offee"         "Dormé"                 "Dooku"                
[67] "Bail Prestor Organa"   "Jango Fett"            "Zam Wesell"           
[70] "Dexter Jettster"       "Lama Su"               "Taun We"              
[73] "Jocasta Nu"            "R4-P17"                "Wat Tambor"           
[76] "San Hill"              "Shaak Ti"              "Grievous"             
[79] "Tarfful"               "Raymus Antilles"       "Sly Moore"            
[82] "Tion Medon"            "Finn"                  "Rey"                  
[85] "Poe Dameron"           "BB8"                   "Captain Phasma"       

arrange() 🏠

Сортировка по колонкам

starwars %>%
  select(name:hair_color) %>%
  arrange(name,desc(mass),hair_color) %>%
  slice_head(n = 3)
# A tibble: 3 × 4
  name             height  mass hair_color
  <chr>             <int> <dbl> <chr>     
1 Ackbar              180    83 none      
2 Adi Gallia          184    50 none      
3 Anakin Skywalker    188    84 blond     
  • Сначала сортируем по столбцу name по возрастанию

  • Потом сортируем по столбцу mass по убыванию

  • Потом сортируем по столбцу hair_color по возрастанию

  • Отсутствующие значения ВСЕГДА в конце

mutate() 🏠

Создать новую колонку

starwars %>%
  select(name:hair_color) %>%
  mutate(HM = height*mass)
# A tibble: 87 × 5
   name               height  mass hair_color       HM
   <chr>               <int> <dbl> <chr>         <dbl>
 1 Luke Skywalker        172    77 blond         13244
 2 C-3PO                 167    75 <NA>          12525
 3 R2-D2                  96    32 <NA>           3072
 4 Darth Vader           202   136 none          27472
 5 Leia Organa           150    49 brown          7350
 6 Owen Lars             178   120 brown, grey   21360
 7 Beru Whitesun Lars    165    75 brown         12375
 8 R5-D4                  97    32 <NA>           3104
 9 Biggs Darklighter     183    84 black         15372
10 Obi-Wan Kenobi        182    77 auburn, white 14014
# ℹ 77 more rows

transmute() 🏠

Создать новую колонку и убрать остальные

starwars %>%
  select(name:hair_color) %>%
  transmute(inv_mass = 1/mass,
            inv_height = 1/height) %>% head(3)
# A tibble: 3 × 2
  inv_mass inv_height
     <dbl>      <dbl>
1   0.0130    0.00581
2   0.0133    0.00599
3   0.0312    0.0104 

rename() 🏠

Переименовать колонку

starwars %>%
  select(name:hair_color) %>%
  rename(NAME=name)
# A tibble: 87 × 4
   NAME               height  mass hair_color   
   <chr>               <int> <dbl> <chr>        
 1 Luke Skywalker        172    77 blond        
 2 C-3PO                 167    75 <NA>         
 3 R2-D2                  96    32 <NA>         
 4 Darth Vader           202   136 none         
 5 Leia Organa           150    49 brown        
 6 Owen Lars             178   120 brown, grey  
 7 Beru Whitesun Lars    165    75 brown        
 8 R5-D4                  97    32 <NA>         
 9 Biggs Darklighter     183    84 black        
10 Obi-Wan Kenobi        182    77 auburn, white
# ℹ 77 more rows

distinct() 🏠

Взять уникальные значения

df <- tribble(
  ~a,~b,~c,
  "a",1,1,
  "a",1,1,
  "a",2,2,
  "b",3,1,
  "b",3,2
)

distinct(df)
# A tibble: 4 × 3
  a         b     c
  <chr> <dbl> <dbl>
1 a         1     1
2 a         2     2
3 b         3     1
4 b         3     2

distinct() 🏠

Взять уникальные значения

df <- tribble(
  ~a,~b,~c,
  "a",1,1,
  "a",1,1,
  "a",2,2,
  "b",3,1,
  "b",3,2
)

distinct(df, a, b)
# A tibble: 3 × 2
  a         b
  <chr> <dbl>
1 a         1
2 a         2
3 b         3

Отладка кода

starwars %>%
  head() %>%
  group_by(eye_color) %>%
  summarise(count = n(),
            height = max(height)) %>% 
  head(3)
# A tibble: 3 × 3
  eye_color count height
  <chr>     <int>  <int>
1 blue          2    178
2 brown         1    150
3 red           1     96
starwars %>%
  #head() %>%
  group_by(eye_color) %>%
  summarise(count = n(),
            height = max(height))
# A tibble: 15 × 3
   eye_color     count height
   <chr>         <int>  <int>
 1 black            10     NA
 2 blue             19    234
 3 blue-gray         1    182
 4 brown            21     NA
 5 dark              1     NA
 6 gold              1    191
 7 green, yellow     1    216
 8 hazel             3     NA
 9 orange            8    224
10 pink              1    180
11 red               5    200
12 red, blue         1     96
13 unknown           3     NA
14 white             1    178
15 yellow           11    264

Не забывайте убирать #, если они больше не нужны

tidyr

unite() 🏠

Объединить колонки

starwars %>%
  select(name:hair_color) %>%
  unite(height, mass, col = 'H_M', sep = '/') -> starwars_unite
head(starwars_unite)
# A tibble: 6 × 3
  name           H_M     hair_color 
  <chr>          <chr>   <chr>      
1 Luke Skywalker 172/77  blond      
2 C-3PO          167/75  <NA>       
3 R2-D2          96/32   <NA>       
4 Darth Vader    202/136 none       
5 Leia Organa    150/49  brown      
6 Owen Lars      178/120 brown, grey

unite() 🏠

Объединить колонки

starwars %>%
  select(name:hair_color) %>%
  unite(height, mass, col = 'H_M', sep = '/', remove = F)
# A tibble: 87 × 5
   name               H_M     height  mass hair_color   
   <chr>              <chr>    <int> <dbl> <chr>        
 1 Luke Skywalker     172/77     172    77 blond        
 2 C-3PO              167/75     167    75 <NA>         
 3 R2-D2              96/32       96    32 <NA>         
 4 Darth Vader        202/136    202   136 none         
 5 Leia Organa        150/49     150    49 brown        
 6 Owen Lars          178/120    178   120 brown, grey  
 7 Beru Whitesun Lars 165/75     165    75 brown        
 8 R5-D4              97/32       97    32 <NA>         
 9 Biggs Darklighter  183/84     183    84 black        
10 Obi-Wan Kenobi     182/77     182    77 auburn, white
# ℹ 77 more rows

separate() 🏠

Разделить колонки

starwars_unite %>%
  separate(H_M, sep = '/', into = c('H', 'M'))
# A tibble: 87 × 4
   name               H     M     hair_color   
   <chr>              <chr> <chr> <chr>        
 1 Luke Skywalker     172   77    blond        
 2 C-3PO              167   75    <NA>         
 3 R2-D2              96    32    <NA>         
 4 Darth Vader        202   136   none         
 5 Leia Organa        150   49    brown        
 6 Owen Lars          178   120   brown, grey  
 7 Beru Whitesun Lars 165   75    brown        
 8 R5-D4              97    32    <NA>         
 9 Biggs Darklighter  183   84    black        
10 Obi-Wan Kenobi     182   77    auburn, white
# ℹ 77 more rows

separate_rows() 🏠

Разделить cтроки

starwars %>%
  select(name:hair_color) %>%
  separate_rows(hair_color, sep = ',')
# A tibble: 90 × 4
   name               height  mass hair_color
   <chr>               <int> <dbl> <chr>     
 1 Luke Skywalker        172    77 "blond"   
 2 C-3PO                 167    75  <NA>     
 3 R2-D2                  96    32  <NA>     
 4 Darth Vader           202   136 "none"    
 5 Leia Organa           150    49 "brown"   
 6 Owen Lars             178   120 "brown"   
 7 Owen Lars             178   120 " grey"   
 8 Beru Whitesun Lars    165    75 "brown"   
 9 R5-D4                  97    32  <NA>     
10 Biggs Darklighter     183    84 "black"   
# ℹ 80 more rows

drop_na() 🏠

Удалить строки с пропущенными значениями

nrow(airquality)
[1] 153
airquality %>%
  drop_na() %>% nrow
[1] 111

replace_na() 🏠

Заменить пропущенные значения

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
as_tibble(airquality) %>%
  replace_na(list(Solar.R = 0))
# A tibble: 153 × 6
   Ozone Solar.R  Wind  Temp Month   Day
   <int>   <int> <dbl> <int> <int> <int>
 1    41     190   7.4    67     5     1
 2    36     118   8      72     5     2
 3    12     149  12.6    74     5     3
 4    18     313  11.5    62     5     4
 5    NA       0  14.3    56     5     5
 6    28       0  14.9    66     5     6
 7    23     299   8.6    65     5     7
 8    19      99  13.8    59     5     8
 9     8      19  20.1    61     5     9
10    NA     194   8.6    69     5    10
# ℹ 143 more rows

fill() 🏠

Заполнить пропущенные значения

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
as_tibble(airquality) %>%
  fill(Ozone)
# A tibble: 153 × 6
   Ozone Solar.R  Wind  Temp Month   Day
   <int>   <int> <dbl> <int> <int> <int>
 1    41     190   7.4    67     5     1
 2    36     118   8      72     5     2
 3    12     149  12.6    74     5     3
 4    18     313  11.5    62     5     4
 5    18      NA  14.3    56     5     5
 6    28      NA  14.9    66     5     6
 7    23     299   8.6    65     5     7
 8    19      99  13.8    59     5     8
 9     8      19  20.1    61     5     9
10     8     194   8.6    69     5    10
# ℹ 143 more rows

readr

Чтение файла 🏠

library(readr) # или library(tidyverse)

penguins <- read_csv("data/penguins.csv")
penguins
# A tibble: 344 × 8
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
   <chr>   <chr>              <dbl>         <dbl>             <dbl>       <dbl>
 1 Adelie  Torgersen           39.1          18.7               181        3750
 2 Adelie  Torgersen           39.5          17.4               186        3800
 3 Adelie  Torgersen           40.3          18                 195        3250
 4 Adelie  Torgersen           NA            NA                  NA          NA
 5 Adelie  Torgersen           36.7          19.3               193        3450
 6 Adelie  Torgersen           39.3          20.6               190        3650
 7 Adelie  Torgersen           38.9          17.8               181        3625
 8 Adelie  Torgersen           39.2          19.6               195        4675
 9 Adelie  Torgersen           34.1          18.1               193        3475
10 Adelie  Torgersen           42            20.2               190        4250
# ℹ 334 more rows
# ℹ 2 more variables: sex <chr>, year <dbl>

Чтение файла 🏠

Посмотреть все параметры: ?read_csv.

Запись файла 🏠

Посмотреть все параметры: ?write_csv.

write_csv(penguins, "more_penguins.csv", append = TRUE)

append = TRUE - дозаписывает к существующему файлу

append = FALSE - создает новый файл и записывает в него

Чтение xlsx файла 🏠

readxl

library(readxl)

my_file <- read_excel("data/my_file.xlsx", sheet = "Best sheet ever")

Конец!