Язык R

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

Лекция 3

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

15 сентября 2023

Конвейеры

%>%

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

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

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   male  mascu…
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 Poe Dame…     NA    NA brown      light      brown             NA male  mascu…
2 BB8           NA    NA none       none       black             NA none  mascu…
3 Captain …     NA    NA unknown    unknown    unknown           NA <NA>  <NA>  
4 Padmé Am…    165    45 brown      light      brown             46 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 Raymus …    188    79 brown      light      brown             NA male  mascu…
 3 Eeth Ko…    171    NA black      brown      brown             NA male  mascu…
 4 Han Solo    180    80 brown      fair       brown             29 male  mascu…
 5 Zam Wes…    168    55 blonde     fair, gre… yellow            NA fema… femin…
 6 Darth M…    175    80 none       red        yellow            54 male  mascu…
 7 Kit Fis…    196    87 none       green      black             NA male  mascu…
 8 Bib For…    180    NA none       pale       pink              NA male  mascu…
 9 Poe Dam…     NA    NA brown      light      brown             NA male  mascu…
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] "Jar Jar Binks"         "Roos Tarpals"          "Rugor Nass"           
[37] "Ric Olié"              "Watto"                 "Sebulba"              
[40] "Quarsh Panaka"         "Shmi Skywalker"        "Darth Maul"           
[43] "Bib Fortuna"           "Ayla Secura"           "Dud Bolt"             
[46] "Gasgano"               "Ben Quadinaros"        "Mace Windu"           
[49] "Ki-Adi-Mundi"          "Kit Fisto"             "Eeth Koth"            
[52] "Adi Gallia"            "Saesee Tiin"           "Yarael Poof"          
[55] "Plo Koon"              "Mas Amedda"            "Gregar Typho"         
[58] "Cordé"                 "Cliegg Lars"           "Poggle the Lesser"    
[61] "Luminara Unduli"       "Barriss Offee"         "Dormé"                
[64] "Dooku"                 "Bail Prestor Organa"   "Jango Fett"           
[67] "Zam Wesell"            "Dexter Jettster"       "Lama Su"              
[70] "Taun We"               "Jocasta Nu"            "Ratts Tyerell"        
[73] "R4-P17"                "Wat Tambor"            "San Hill"             
[76] "Shaak Ti"              "Grievous"              "Tarfful"              
[79] "Raymus Antilles"       "Sly Moore"             "Tion Medon"           
[82] "Finn"                  "Rey"                   "Poe Dameron"          
[85] "BB8"                   "Captain Phasma"        "Padmé Amidala"        

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")

stringr

Строки 🏠

vkusno <- c("яблоко", "вишня", "лемон", "арбуз")
typeof(vkusno)
[1] "character"


c("Данные для анализа далеко не всегда попадают в руки исследователя в приемлемой форме. Обычно достаточно большое время уходит на подготовку данных к анализу, сведение информации из разных источников, преобразование данных в необходимую форму или формат. Еще одна проблема заключается в том, что предложенные для анализа данные могут быть плохого качества, содержать много пропущенных значений, выбросов, ошибок. Прежде чем брать данные в исследование необходимо убедиться, что они пригодны для работы.", "Разведывательный анализ данных может сильно сэкономить время и поможет выявить проблемы на начальном этапе. Работа с огромными таблицами не всегда удобна для человеческого восприятия, важно уметь красиво визуализировать свои результаты, что делает их более наглядными и подкрепляет полученные выводы.")
[1] "Данные для анализа далеко не всегда попадают в руки исследователя в приемлемой форме. Обычно достаточно большое время уходит на подготовку данных к анализу, сведение информации из разных источников, преобразование данных в необходимую форму или формат. Еще одна проблема заключается в том, что предложенные для анализа данные могут быть плохого качества, содержать много пропущенных значений, выбросов, ошибок. Прежде чем брать данные в исследование необходимо убедиться, что они пригодны для работы."
[2] "Разведывательный анализ данных может сильно сэкономить время и поможет выявить проблемы на начальном этапе. Работа с огромными таблицами не всегда удобна для человеческого восприятия, важно уметь красиво визуализировать свои результаты, что делает их более наглядными и подкрепляет полученные выводы."                                                                                                                                                                                                        

Строки 🏠

starwars %>% select(where(is.character))
# A tibble: 87 × 8
   name           hair_color skin_color eye_color sex   gender homeworld species
   <chr>          <chr>      <chr>      <chr>     <chr> <chr>  <chr>     <chr>  
 1 Luke Skywalker blond      fair       blue      male  mascu… Tatooine  Human  
 2 C-3PO          <NA>       gold       yellow    none  mascu… Tatooine  Droid  
 3 R2-D2          <NA>       white, bl… red       none  mascu… Naboo     Droid  
 4 Darth Vader    none       white      yellow    male  mascu… Tatooine  Human  
 5 Leia Organa    brown      light      brown     fema… femin… Alderaan  Human  
 6 Owen Lars      brown, gr… light      blue      male  mascu… Tatooine  Human  
 7 Beru Whitesun… brown      light      blue      fema… femin… Tatooine  Human  
 8 R5-D4          <NA>       white, red red       none  mascu… Tatooine  Droid  
 9 Biggs Darklig… black      light      brown     male  mascu… Tatooine  Human  
10 Obi-Wan Kenobi auburn, w… fair       blue-gray male  mascu… Stewjon   Human  
# ℹ 77 more rows

Работа с строками - stringr 🏠

library(stringr) # или library(tidyverse)


weekdays <- c("Monday", "Tuesday", "Wednesday", "Thursday", 
              "Friday", "Saturday", "Sunday")
weekdays
[1] "Monday"    "Tuesday"   "Wednesday" "Thursday"  "Friday"    "Saturday" 
[7] "Sunday"   

str_length() 🏠

Подсчитать длину строки.

str_length(weekdays)
[1] 6 7 9 8 6 8 6

Функции из stringr можно применять к строковым столбцам в датафрейме.

starwars %>% 
  transmute(name, name_length = str_length(name))
# A tibble: 87 × 2
   name               name_length
   <chr>                    <int>
 1 Luke Skywalker              14
 2 C-3PO                        5
 3 R2-D2                        5
 4 Darth Vader                 11
 5 Leia Organa                 11
 6 Owen Lars                    9
 7 Beru Whitesun lars          18
 8 R5-D4                        5
 9 Biggs Darklighter           17
10 Obi-Wan Kenobi              14
# ℹ 77 more rows

Поиск слов в строке 🏠

str_detect()

Содержит ли строка слово/шаблон - возвращает логический вектор.

str_detect(weekdays, "Sun") # содержит Sun
[1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
str_detect(weekdays, "day") # содержит day
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE


str_which()

Содержит ли строка слово/шаблон - возвращает индексы.

str_which(weekdays, "Sun") # содержит Sun
[1] 7

Поиск шаблонов в строке 🏠

str_detect()

Содержит ли строка слово/шаблон - возвращает логический вектор.

str_detect(weekdays,"^S") # начинается на S
[1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE
str_detect(weekdays,"day$") # заканчивается на day
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE


str_which()

Содержит ли строка слово/шаблон - возвращает индексы.

str_which(weekdays,"^S") # начинается на S
[1] 6 7

Регулярные выражения 🏠

Cheat sheet

Регулярные выражения 🏠

str_count() 🏠

Подсчет обнаруженных совпадений в строке.

str_count(weekdays, "[aeiou]") # подсчитать все гласные
[1] 2 3 3 2 2 3 2


Специальные символы нужно экранировать.

str_count(c("what?", "when??", "how?!!"), "?")
Error in stri_count_regex(string, pattern, opts_regex = opts(pattern)): Syntax error in regex pattern. (U_REGEX_RULE_SYNTAX, context=`?`)
str_count(c("what?", "when??", "how?!!"), "\\?")
[1] 1 2 1

Визуализировать регулярные выражения 🏠

str_view_all(weekdays, "[aeiou]")
[1] │ M<o>nd<a>y
[2] │ T<u><e>sd<a>y
[3] │ W<e>dn<e>sd<a>y
[4] │ Th<u>rsd<a>y
[5] │ Fr<i>d<a>y
[6] │ S<a>t<u>rd<a>y
[7] │ S<u>nd<a>y

Поиск шаблонов в строке 🏠

  • str_remove() и str_remove_all() - удаляет символы по шаблону
  • str_replace() и str_replace_all() - заменяет символы по шаблону
  • str_extract() и str_extract_all() - возвращает первое найденное слово/шаблон в каждой строке
  • str_subset() - возвращает строки, содержащие слово/шаблон

🏠

Возьмите встроенный набор данных - fruit.

  1. Удалите из названий фруктов все гласные буквы (aeiou). Используйте функции str_remove() и str_remove_all(). Сравните результаты.
  2. Найдите все названия фруктов, которые содержат слово berry.

str_remove() удаляет символы по шаблону, но только первое вхождение. str_remove_all() удаляет все вхождения.

str_remove_all(fruit, "[aeiou]")
 [1] "ppl"         "prct"        "vcd"         "bnn"         "bll pppr"   
 [6] "blbrry"      "blckbrry"    "blckcrrnt"   "bld rng"     "blbrry"     
[11] "bysnbrry"    "brdfrt"      "cnry mln"    "cntlp"       "chrmy"      
[16] "chrry"       "chl pppr"    "clmntn"      "cldbrry"     "ccnt"       
[21] "crnbrry"     "ccmbr"       "crrnt"       "dmsn"        "dt"         
[26] "drgnfrt"     "drn"         "ggplnt"      "ldrbrry"     "fj"         
[31] "fg"          "gj brry"     "gsbrry"      "grp"         "grpfrt"     
[36] "gv"          "hnydw"       "hcklbrry"    "jckfrt"      "jmbl"       
[41] "jjb"         "kw frt"      "kmqt"        "lmn"         "lm"         
[46] "lqt"         "lych"        "mndrn"       "mng"         "mlbrry"     
[51] "nctrn"       "nt"          "lv"          "rng"         "pml"        
[56] "ppy"         "pssnfrt"     "pch"         "pr"          "prsmmn"     
[61] "physls"      "pnppl"       "plm"         "pmgrnt"      "pml"        
[66] "prpl mngstn" "qnc"         "rsn"         "rmbtn"       "rspbrry"    
[71] "rdcrrnt"     "rck mln"     "sll brry"    "stsm"        "str frt"    
[76] "strwbrry"    "tmrll"       "tngrn"       "gl frt"      "wtrmln"     

str_subset() возвращает строки, содержащие слово/шаблон.

str_subset(fruit, "berry")
 [1] "bilberry"    "blackberry"  "blueberry"   "boysenberry" "cloudberry" 
 [6] "cranberry"   "elderberry"  "goji berry"  "gooseberry"  "huckleberry"
[11] "mulberry"    "raspberry"   "salal berry" "strawberry" 

str_split() 🏠

Разделить строку по разделителю/шаблону. Возвращает список.

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

[[2]]
[1] NA

[[3]]
[1] NA

[[4]]
[1] "none"

[[5]]
[1] "brown"

[[6]]
[1] "brown" "grey" 

[[7]]
[1] "brown"

[[8]]
[1] NA

[[9]]
[1] "black"

[[10]]
[1] "auburn" "white" 

[[11]]
[1] "blond"

[[12]]
[1] "auburn" "grey"  

[[13]]
[1] "brown"

[[14]]
[1] "brown"

[[15]]
[1] NA

[[16]]
[1] NA

[[17]]
[1] "brown"

[[18]]
[1] "brown"

[[19]]
[1] "white"

[[20]]
[1] "grey"

[[21]]
[1] "black"

[[22]]
[1] "none"

[[23]]
[1] "none"

[[24]]
[1] "black"

[[25]]
[1] "none"

[[26]]
[1] "none"

[[27]]
[1] "auburn"

[[28]]
[1] "brown"

[[29]]
[1] "brown"

[[30]]
[1] "none"

[[31]]
[1] "brown"

[[32]]
[1] "none"

[[33]]
[1] "blond"

[[34]]
[1] "none"

[[35]]
[1] "none"

[[36]]
[1] "none"

[[37]]
[1] "brown"

[[38]]
[1] "black"

[[39]]
[1] "none"

[[40]]
[1] "black"

[[41]]
[1] "black"

[[42]]
[1] "none"

[[43]]
[1] "none"

[[44]]
[1] "none"

[[45]]
[1] "none"

[[46]]
[1] "none"

[[47]]
[1] "none"

[[48]]
[1] "none"

[[49]]
[1] "white"

[[50]]
[1] "none"

[[51]]
[1] "black"

[[52]]
[1] "none"

[[53]]
[1] "none"

[[54]]
[1] "none"

[[55]]
[1] "none"

[[56]]
[1] "none"

[[57]]
[1] "black"

[[58]]
[1] "brown"

[[59]]
[1] "brown"

[[60]]
[1] "none"

[[61]]
[1] "black"

[[62]]
[1] "black"

[[63]]
[1] "brown"

[[64]]
[1] "white"

[[65]]
[1] "black"

[[66]]
[1] "black"

[[67]]
[1] "blonde"

[[68]]
[1] "none"

[[69]]
[1] "none"

[[70]]
[1] "none"

[[71]]
[1] "white"

[[72]]
[1] "none"

[[73]]
[1] "none"

[[74]]
[1] "none"

[[75]]
[1] "none"

[[76]]
[1] "none"

[[77]]
[1] "none"

[[78]]
[1] "brown"

[[79]]
[1] "brown"

[[80]]
[1] "none"

[[81]]
[1] "none"

[[82]]
[1] "black"

[[83]]
[1] "brown"

[[84]]
[1] "brown"

[[85]]
[1] "none"

[[86]]
[1] "unknown"

[[87]]
[1] "brown"

stringr - что почитать 🏠

Конец!