-
Notifications
You must be signed in to change notification settings - Fork 1
/
01_introduction_to_r.Rmd
1387 lines (925 loc) · 59.7 KB
/
01_introduction_to_r.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
---
title: "Знакомство с R"
author: "Марина Варфоломеева"
output:
html_document:
toc: yes
toc_depth: 2
toc_float:
collapsed: no
theme: flatly
highlight: haddock
include:
after_body: _footer.html
css: my_styles.css
lib_dir: site_libs
self_contained: no
bibliography:
- "bibs/references.bib"
- "bibs/01_packages.bib"
csl: "bibs/ecology.csl"
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library("knitcitations")
cleanbib()
options("citation_format" = "pandoc")
# Knitr hooks
knitr::knit_hooks$set(
hide_button = function(before, options, envir) {
if (is.character(options$hide_button)) {
button_text = options$hide_button
} else {
button_text = "Решение"
}
block_label <- paste0("hide_button", options$label)
if (before) {
return(paste0(sep = "\n",
'<button class="btn btn-primary btn-sm" data-toggle="collapse" data-target="#', block_label, '"> ', button_text, ' </button>\n',
'<div id="', block_label, '" class="collapse">\n'))
} else {
return("</div><br />\n")
}
},
output = function(x, options){
x <- gsub(x, pattern = "<", replacement = "<")
x <- gsub(x, pattern = ">", replacement = ">")
paste0(
"<pre class=\"r-output\"><code>",
fansi::sgr_to_html(x = x, warn = TRUE, term.cap = "256"),
# ansistrings::ansi_to_html(text = x, fullpage = FALSE),
"</code></pre>"
)
}
)
```
---
# Данные к этому занятию
- [Код](https://varmara.github.io/proteomics/01_introduction_to_r.R)
- Данные [@kikuta_proteome_2009]:
- [expression_3.csv](https://varmara.github.io/proteomics/data/expression_3.csv)
- [expression_3.xlsx](https://varmara.github.io/proteomics/data/expression_3.xlsx)
- [expression_3.zip](https://varmara.github.io/proteomics/data/expression_3.zip)
---
# Как появился R
R `r citep(citation())` --- это язык для статистического анализа и визуализации данных. Он возник как ответвление языка S/Splus, разработанного еще в 70-х годах в Bell Laboratories.
<img src="images/Rlogo.svg" width=150px alt="R logo">
---
[Росс Ихака](https://en.wikipedia.org/wiki/Ross_Ihaka) (Ross Ihaka) и [Роберт Джентльмен](https://en.wikipedia.org/wiki/Robert_Gentleman_(statistician)) (Robert Gentleman), молодые ученые из университета Окленда, Новая Зеландия разработали R в 1993 году [@ihaka_r:_1998].
<img src="images/Robert_Gentleman_and_Ross_Ihaka.png" alt="Роберт Джентльмен и Росс Ихака">
<small>Роберт Джентльмен и Росс Ихака, [источник: Росс Ихака](https://www.stat.auckland.ac.nz/~ihaka/downloads/the-r-project.pdf)</small>
---
Сейчас Росс Ихака занимается статистикой [в университете Окленда](https://www.stat.auckland.ac.nz/~ihaka/) (Associate Professor). В 2010 году Ихака начал работать над новым языком с целью усовершенствовать R и улучшить его быстродействие [@ihaka_r:_2010].
<img src="images/Ihaka.jpg" alt="Росс Ихака" style="height:250px;">
<small>Росс Ихака, [источник: сайт university of Waikato](http://www.waikato.ac.nz/news-events/media/2015/learning-another-language-on-kngitanga-day)</small>
---
Роберт Джентльмен работал как ученый и эксперт в нескольких компаниях биотехнологического и генетического профиля, и недавно стал вицепрезидентом компании 23andMe как эксперт в биоинформатике. Еще в 2001 году Роберт Джентльмен начал работать над проектом [Bioconductor](http://www.bioconductor.org/).
<img src="images/Bioconductor-logo.jpg" alt="Bioconductor logo" style="width:200px;">
<img src="images/Gentleman.jpg" alt="Роберт Джентльмен" style="height:250px;">
<small>Роберт Джентльмен, [источник: Susie Fitzhugh](https://www.fredhutch.org/en/news/center-news/2009/05/Gentlemen-presents-lecture.html)</small>
# RStudio --- среда разработки
## Создатели RStudio
RStudio [@rstudio_team_rstudio:_2019] --- это свободно распространяемая среда для разработки (integrated development environment) на языке R.
<img src="images/RStudio-logo.png">
RStudio была основана в 2009 году американским программистом и интернет-предпринимателем [Джозефом Аллером](https://en.wikipedia.org/wiki/Joseph_J._Allaire) (Joseph J. Allaire). Среду RStudio можно устанавливать на компьютеры с разными операционными системами (Windows, OS X, and Linux).
<img src="images/Jeremy_Allaire_by_Hubert_Burda_Media_on_Flickr.jpg" alt="Джозеф Аллер" style="height:250px;">
<small>Джозеф Аллер, [источник: Hubert Burda Media on Flickr](https://flic.kr/p/jn7JDS)</small>
Сейчас RStudio, пожалуй, самый удобный вариант среды для разработки на R. Мне кажется, что бум использования R в начале 10-х годов отчасти объясняется тем, что писать программы стало гораздо удобнее благодаря появлению среды RStudio.
К слову, вторая причина роста популярности R --- это появление графического пакета ggplot2 `r citep(citation("ggplot2"))`, написанного [Хедли Викхемом](http://hadley.nz/) (Hadley Wickham). Этот пакет во много раз облегчил построение сложных и красивых графиков. С тех пор Хедли Викхем написал еще много полезных пакетов и сейчас работает Chief Scientist в RStudio и Adjunct Professor в университете Окленда.
<img src="images/Wickham.jpg" alt="Хедли Викхем" style="height:250px;">
<small>Хедли Викхем, [источник: Hadley Wickham](https://twitter.com/hadleywickham)</small>
Для работы над этим курсом вам понадобится установить
- [R](http://cran.r-project.org/)
- [RStudio](https://www.rstudio.com/products/rstudio/download/preview/)
## Устройство RStudio
<img src="images/RStudio.png" alt="RStudio">
Окно редактора RStudio разделено на 4 области:
1. код (зеленый прямоугольник на схеме) - это обычный текстовый редактор, в котором открывают и редактирут файлы с программами.
2. консоль/RMarkdown (оранжевый прямоугольник на схеме). На вкладке консоль можно в живом режиме выполнять команды R, если вы не хотите их сохранять в виде программы.
3. файлы/графики/пакеты/помощь/просмотр (желтый прямоугольник на схеме). На вкладке помощь можно просматривать файлы справки. На вкладке графики будут появляться графики. На вкладке файлы расположен файловый менеджер, который позволяет перемещаться по директориям вашего проекта и компьютера.
4. среда/история (и еще может быть /Git, если ваш проект под контролем версий) (синий прямоугольник на схеме). На вкладке история есть список всех выполненных команд R. На вкладке среда расположен список объектов, находящихся в памяти.
<img src="images/RStudio-layout.png" alt="структура RStudio">
## Организация рабочего пространства
1. Создайте папку (например, `Proteomics`), где будут храниться ВСЕ материалы курса. Например: Мы будем ее называть __рабочей директорией__. В эту папку помещайте ВСЕ файлы с кодом (с расширением .R).
2. Внутри папки `Proteomics` создайте папку `data`, где будут храниться все файлы с данными для анализа.
В итоге у вас должно получиться примерно это:
```
C:\Proteomics\
C:\Proteomics\data\
```
## Настройка
Все настройки RStudio находятся меню Tools -> Global Options
- Восстановление рабочено пространства из прошлого сеанса --- это лучше отменить, т.к. обычно переменные-призраки очень мешают. На вкладке `General` убираем галочку `Restore .RData into workspace at startup`, и меняем `Save workspace to .RData on exit` - `Never`.
- Перенос длинных строк в окне кода --- это удобно. На вкладке `Code` ставим галочку рядом с опцией `Soft-wrap R source files`.
## Клавиатурные сокращения
- `Ctrl + Shift + C` - закомментировать/раскомментировать выделенный фрагмент кода.
- `Ctrl + Enter` - отправляет строку из текстового редактора в консоль, а если выделить несколько строк, то будет выполнен этот фрагмент кода.
- `Tab` или `Ctrl + Space` - нажмите после того как начали набирать название функции или переменной, и появится список автоподстановки. Это помогает печатать код быстро и с меньшим количеством ошибок.
Автоподстановка названий функций начинает работать как только вы ввели несколько первых букв названия функции. Вы можете вызвать ее раньше, если нажмете `Tab` или `Ctrl + Space`.
<img src="images/autocompletion.png" alt="автоподстановка названий функций в RStudio">
Как только вы полностью ввели название функции и скобки, RStudio автоматически ставит закрывающую скобку и показывает раздел справки Usage для этой функции.
<img src="images/autocompletion1.png" alt="автоподстановка аргументов функций в RStudio">
Если вы нажмете `Tab` или `Ctrl + Space`, когда курсор находится внутри скобок, то вам покажут список аргументов этой функции с расшифровками их значений из раздела справки Arguments для этой функции.
<img src="images/autocompletion2.png" alt="автоподстановка аргументов функций в RStudio">
# Установка дополнительных пакетов
R --- модульная система, он состоит из пакетов. Некоторые пакеты уже установлены, другие придется устанавливать из внешнего репозитория.
Из центрального репозитория `R` `CRAN` пакеты можно установить при помощи функции `install.packages()`, указав имя пакета. Запустите RStudio (с правами администратора, если вы в Windows) и, для начала, установите пакеты `ggplot2` и `readxl` --- они нам сегодня понадобятся.
```{r eval=FALSE}
# Из репозитория CRAN
install.packages("ggplot2")
install.packages("readxl")
```
Остальные пакеты мы будем устанавливать по мере необходимости.
Пакеты единожды устанавливаются в локальную библиотеку, затем их нужно активировать для работы один раз за сеанс.
# Основы языка R
## Математические операции
```{r}
2 + 3
36 / 2
7 * 4
5 ^ 2
```
Для некоторых операций есть специальные функции:
```{r}
sqrt(27)
```
#### Задание 1
Найдите длину гипотенузы прямоугольного треугольника со сторонами 3 и 5 см.
```{r purl=FALSE, hide_button=TRUE}
sqrt(3^2 + 5^2)
```
#### Задание 2
Извлеките кубический корень из 27.
```{r purl=FALSE, hide_button=TRUE}
27^(1 / 3) # кубический корень
```
## Предупреждения и ошибки (warnings and errors)
Предупреждения
```{r}
sqrt(-27)
```
Ошибки
```{r eval=FALSE}
sqr(27)
```
```
Error: could not find function "sqr"
```
## Как можно получить помощь в R
1) В `RStudio` можно поставить курсор на название функции и нажать `F1`
`sqrt()`
2) Перед названием функции можно напечатать знак вопроса и выполнить эту строку
`?sqrt`
3) Можно воспользоваться функцией `help()`
`help("sqrt")`
Все файлы справки состоят из нескольких типов разделов.
<img src="images/helpstructureannotated.png" alt="Как устроена справка в R">
### Задание 3
Что делает функция `round()`?
```{r purl=FALSE, hide_button=TRUE}
# Справка
?round
help("round")
```
### Задание 4
Посмотрите в справку к функции `log()`. Какое основание логарифма используется в R по умолчанию?
```{r purl=FALSE, hide_button=TRUE}
# Справка
?log
help("log")
```
## Переменные (variables)
Можно сохранить результат любого вычисления или любую величину в переменной. Переменные - это такие контейнеры, в которые можно положить разные данные (и даже функции).
Оператор присваивания это символ стрелочки `<-`
Он работает справа налево, это значит, что значение выражения в его правой части присваивается объекту в левой части. Есть еще более экзотический оператор присваивания слева направо `->`, но его не рекомендуют использовать оттого, что хуже читается код.
Имена переменных могут содержать латинские буквы обоих регистров, символы точки . и подчеркивания _ , а так же цифры. Имена переменных должны начинаться с латинских букв. Создавайте понятные и "говорящие" имена переменных.
```{r}
num_1 <- 1024 / 2
num_1
1238 * 3 -> num_2 # экзотический вариант
num_2
```
Правила именования переменных
Просто `a` --- плохо, и даже `b`, `с`, или `х`. Но в некоторых случаях название из одной буквы вполне допустимо:)
- `var1` --- плохо, но уже лучше
- `var_1` --- тоже плохо, но уже лучше
- `shelllength` --- говорящее, но плохо читается
- `shell_length`, `wing_colour` или `leg_num` --- хорошие, говорящие, короткие, но вполне читабельные названия.
Осторожно, переменные можно случайно или намеренно перезаписать. Пока что `num_1` было равно `r num_1`, но если мы присвоим переменной `num_1` другое значение --- ее содержимое изменится.
```{r}
num_1
num_1 <- 2^2
num_1
```
Код --- это линейная последовательность действий.
Переменные можно использовать только после того, как они были созданы.
Пример 1
```{r eval=FALSE}
# Неправильно:
box_wt <- 1.2
apples <- 6
box / apples # ошибка. переменная box еще не была создана.
# нужная переменная называется box_wt.
# Правильно:
box_wt <- 1.2
apples <- 6
box_wt / apples
```
Пример 2
```{r eval=FALSE}
# Неправильно:
box <- 1.3
box / fruits # ошибка. переменная fruits еще не была создана.
fruits <- 7
# Правильно:
box <- 1.3
fruits <- 7
box / fruits
```
#### Задание 5
Переставьте строки так, чтобы код можно было выполнить без ошибки.
```{r eval=FALSE}
distance <- 120
speed <- distance / time
time <- 6
```
```{r purl=FALSE, hide_button=TRUE}
distance <- 120
time <- 6 # сначала создаем переменную time
speed <- distance / time # только потом ее используем
```
#### Задание 6
Ширина прямоугольника 2 см, а длина на 7 см больше. Чему равен периметр? (В решении создайте и используйте переменные `width`, `len` и `per`).
```{r purl=FALSE, hide_button=TRUE}
width <- 2 # Ширина
len <- width + 7 # Длина
per <- 2 * (width + len) # Периметр
```
## Типы данных в R
В R всего шесть различных типов данных. Но нам пригодятся только некоторые из них.
<img src="images/data-types.png">
### Числовые данные
Мы только что их видели.
По умолчанию используется тип `numeric`, который позволяет хранить целые и дробные числа.
<img src="images/data-type-numeric.png">
Есть еще тип `integer`, который предназначен для хранения целых чисел.
<img src="images/data-type-integer.png">
И, наконец, тип `complex` используется для хранения комплексных чисел.
<img src="images/data-type-complex.png">
### Текстовые данные (`character`)
Текстовые данные используются для хранения последовательностей символов произвольной длины.
<img src="images/data-type-character.png">
Каждый текстовый элемент должен быть окружен кавычками - двойными или одинарными
```{r}
"это текст"
'это тоже текст'
```
### Логические данные (`logical`)
Логические данные используются для записи значений типа истина/ложь.
<img src="images/data-type-logical.png">
В R определены две логические константы: `TRUE` и `FALSE`
```{r}
TRUE # истина
FALSE # ложь
```
Для ленивых --- если вы вдруг очень спешите, то можно сокращать первыми заглавными буквами. Но лучше так не делать, чтобы читать программы было легче.
```{r}
T
F
```
### Сырые данные (`raw`)
Тип `raw` используется для хранения "сырых" последовательностей байтов. Это очень экзотический тип, нам он не пригодится.
<img src="images/data-type-raw.png">
### Встроенные в R константы
В R есть несколько встроенных констант. Нам пригодятся только несколько из них.
<img src="images/constants.png">
`NA` --- англ _"not available"_. Когда объект был, но его свойство не измерили или не записали. Что произойдет с `NA` при различных операциях?
```{r}
NA + 2
NA * 0
NA / 0
sqrt(NA)
```
`Inf` --- _"infinity"_ --- бесконечность. Вы увидите `Inf` при делении чисел на ноль.
```{r}
1 / 0
```
`NaN` --- _"not a number"_. `NaN` получится при делении нуля на ноль, или если взять корень из отрицательного числа.
```{r}
0 / 0
sqrt(-1)
```
`NULL` --- ноль, т.е. это значит "пусто", "ничего нет".
# Основные структуры данных в R
Данные в R можно хранить в виде разных объектов: вектор, матрица, массив, список, датафрейм. Мы бегло рассмотрим только некоторые из них.
## Векторы (vectors)
Основной объект R - векторы. Векторы - один объект, внутри которого может быть одно или несколько значений. Главное, чтобы эти значения относились к одному и тому же типу данных.
<img src="images/vectors.png">
Вам могло показаться, что в результате выполнения следующих команд получаются просто числа:
```{r}
23
sqrt(25)
```
но на самом деле, это векторы единичной длины. В R можно легко создавать векторы большей длины.
### Создание векторов из произвольных элементов
Функция `c()` --- от англ. _concatenate_. Функция `c` принимает несколько (произвольное количество) аргументов, разделенных запятыми, и собирает из них вектор (см. справку `?c`). Когда используете функцию `c()`, следите, чтобы было английское "си", а не русское "эс".
```{r}
c(2, 4, 6)
c(-9.3, 0, 2.17, 21.3)
```
Векторы можно хранить в переменных для последующего использования.
```{r}
vect_num <- c(2, 4, 6, 8, 10, 12, 14, 16)
vect_num_1 <- c(1.3, 1.7, NA, 0.9, 1.6, 1.4)
```
При помощи функции `c()` можно объединять несколько векторов в один вектор.
```{r}
c(1, 1, 5:9)
c(vect_num, vect_num_1)
c(100, vect_num)
```
Вектора могут содержать не только числа, но и логические значения, текст.
```{r}
c(TRUE, TRUE, TRUE, FALSE, FALSE, TRUE)
colours <- c("red", "orange", "yellow", "green", "blue", "violet")
```
#### Задание 7
Создайте вектор, в котором будут буквами закодированы нуклеотиды ДНК в алфавитном порядке.
```{r purl=FALSE, hide_button=TRUE}
# Решение
c("A", "C", "G", "T")
```
#### Задание 8
Создайте вектор, в котором будет три наименьших отрицательных целых числа в порядке возрастания.
```{r purl=FALSE, hide_button=TRUE}
# Решение
c(-3, -2, -1)
```
### Создание векторов из целых чисел подряд
Оператор `:` используется для создания целочисленных векторов, где значения следуют одно за другим без пропусков
```{r}
1:10 # от одного до 10
-5:3 # от -5 до 3
```
#### Задание 9
Создайте вектор из целых чисел от 1 до 100. Как вы думаете, что означают номера в квадратных скобках в начале каждой строки?
```{r purl=FALSE, hide_button=TRUE}
1:100
# Номера в квадратных скобках - порядковый номер первого элемента строки
```
### Создание векторов из повторяющихся элементов
Чтобы создавать длинные векторы из повторяющихся элементов, можно использовать функцию `rep()`
`?rep`
```{r}
rep(x = 1, times = 3) # 1 повторяется 3 раза
rep(x = "red", times = 5) # "red" повторяется 5 раз
rep(x = TRUE, times = 2) # TRUE повторяется 2 раза
```
Названия аргументов функций в R можно не указывать, если вы используете аргументы в том же порядке, что прописан в `help` к этой функции.
```{r}
rep(TRUE, 5) # TRUE повторяется 5 раз, аргументы без названий
```
Создаем логический вектор, где `TRUE` повторяется 3 раза, `FALSE` 3 раза и `TRUE` 4 раза. Результат сохраняем в переменной `vect_log`.
```{r}
vect_log <- c(rep(TRUE, 3), rep(FALSE, 3), rep(TRUE, 4))
vect_log
```
#### Задание 10
Создайте вектор `season` в котором названия времен года будут следовать в том же порядке, что и месяцы года, к которым они относятся (начиная с января).
```{r purl=FALSE, hide_button=TRUE}
# Без использования rep()
season <- c("winter", "winter", "spring", "spring", "spring", "summer", "summer", "summer", "autumn", "autumn", "autumn", "winter")
# С использованием rep()
season <- c(rep("winter", 2),
rep(c("spring", "summer", "autumn"), each = 3),
"winter")
```
### Адресация внутри векторов
При помощи оператора `[]`, мужно обратится к некоторым элементам вектора.
<img src="images/address-vector.png">
В квадратных скобках вам нужно указать порядковые номера элементов вектора, которые вы хотите добыть --- один или несколько.
```{r}
vect_num # весь вектор
vect_num[1] # первый элемент
vect_num[3] # 3-й элемент
```
Если вам нужно несколько элементов, то их нужно указать в квадратных скобках их порядковые номера в виде вектора.
```{r}
colours # весь вектор
colours[3:5] # 3-5 элемент
```
Аналогично, если вам нужны элементы не подряд, то укажите в квадратных скобках вектор с номерами элементов, который вы создали при помощи функции `c()`.
```{r}
vect_num[c(2, 4, 6)]
colours[c(1, 6)]
```
Вектор --- одномерный объект. У его элементов только один порядковый номер (индекс). Поэтому при обращении к элементам вектора нужно указывать только одно число или один вектор с адресами. R выдаст ошибку, если при обращении к вектору, вы не создавали вектор, а просто перечислили номера элементов через запятую.
```{r eval=FALSE}
vect_num[2, 4, 6]
```
```
Error in vect_num[2, 4, 6] : incorrect number of dimensions
```
```{r eval=FALSE}
colours[1, 6]
```
```
Error in colours[1, 6] : incorrect number of dimensions
```
Если попытаться добыть из вектора номер элемента, которого там точно нет, то R выдаст `NA`, потому, что такого элемента нет
```{r}
vect_num[198]
```
В R есть встроенные константы, которые помогают быстро генерировать искуственные текстовые векторы (см. `?Constants`).
```{r}
LETTERS
letters
month.abb
month.name
```
#### Задание 11
Извлеките из вектора `month.name`
- летние месяцы,
- зимние месяцы.
```{r purl=FALSE, hide_button=TRUE}
# летние месяцы
month.name[6:8]
# зимние месяцы
month.name[c(12, 1, 2)]
```
#### Задание 12
Извлеките из вектора LETTERS буквы в таком порядке, чтобы получилось слово `SUN`.
```{r purl=FALSE, hide_button=TRUE}
LETTERS[c(19, 21, 14)]
```
### Операции с векторами
Поэкспериментируем с векторами. Проверим, как работают арифметические операции
```{r}
vect_num + 2
vect_num * 2
vect_num * (-2)
vect_num^2
```
Арифметические операции выполняются с каждым элементом вектора --- это __векторизованные операции__.
С самими векторами тоже можно делать некоторые операции.
```{r}
sum(vect_num)
length(vect_num)
mean(vect_num)
min(vect_num)
```
#### Задание 13
Создайте переменную `powers_of_two`, в которой сохраните последовательность из целочисленных степеней двойки --- с первой по пятую. Используйте векторизацию. Выведите содержимое `powers_of_two` в консоль.
```{r purl=FALSE, hide_button=TRUE}
powers_of_two <- 2^(1:5)
powers_of_two
```
## Матрицы (matrices)
Матрицы --- это двумерные объекты, похожие на таблицы, в которых хранятся данные только одного определенного типа.
<img src="images/matrix.png">
Матрицы создают при помощи функции `matrix()`, которой нужно передать вектор с данными и размер будущей матрицы (число строк или столбцов).
```{r}
# Матрица с числовыми данными
matrix(data = 1:12, nrow = 4)
# Матрица с текстовыми данными
matrix(data = LETTERS[1:12], ncol = 6)
```
Обычно элементы записываются в матрицу столбцами
```{r}
matrix(data = 1:6, ncol = 3)
```
Порядок заполнения матрицы элементами можно изменить, если указать `byrow = TRUE`.
```{r}
matrix(data = 1:6, ncol = 3, byrow = TRUE)
```
### Адресация в матрицах
Поскольку матрицы --- это двумерные объекты, позиции элементов в них можно описать при помощи двух индексов, в отличие от векторов. Первым в квадратных скобках следует номер строки, вторым --- номер столбца
<img src="images/address-matrix.png">
```{r}
mat <- matrix(data = LETTERS[1:12], ncol = 3)
mat
mat[3, 2]
mat[1, ]
mat[, 3]
mat[, -1]
mat[1:3, c(1, 3)]
```
#### Задание 14
Создайте матрицу `calendar` с названиями месяцев, так, чтобы в первой строке был первый квартал.
```{r purl=FALSE, hide_button=TRUE}
calendar <- matrix(data = month.name, ncol = 3, byrow = TRUE)
calendar
```
#### Задание 15
Выберите из матрицы `calendar` месяцы третьего квартала.
```{r purl=FALSE, hide_button=TRUE}
calendar[3, ]
```
#### Задание 16
Выберите из матрицы `calendar` июнь.
```{r purl=FALSE, hide_button=TRUE}
calendar[2, 3]
```
## Массивы (arrays)
Массивы --- это многомерные объекты, в которых можно хранить данные одного и того же типа. По структуре они очень похожи на матрицы
<img src="images/array.png">
```{r}
ar <- array(data = 1:24, dim = c(2, 4, 3))
ar
```
### Адресация в массивах
Адреса в массивах указываются в том же порядке: сначала идет строка, за ней столбец, затем следуют прочие измерения.
<img src="images/address-array.png">
```{r}
ar[1, 2, 3]
ar[, , 1]
ar[, 1, ]
ar[1, , ]
ar[1, 1:3, 1]
ar[, , -1]
```
## Датафреймы (data frames)
Датафреймы --- это такие двумерные таблицы, в которых столбцы могут содержать данные разных типов.
<img src="images/data.frame.png">
```{r}
x <- 2014:2017
y <- LETTERS[1:4]
z <- c(TRUE, TRUE, FALSE, TRUE)
dat <- data.frame(year = x, type = y, test_passed = z, stringsAsFactors = FALSE)
dat
```
### Адресация в датафреймах
Чтобы вытащить фрагмент датафрейма, можно использовать несколько вариантов действий.
Во-первых, оператор `[]` работает с датафреймами точно так же как и с матрицами. Поскольку датафреймы --- это двумерные объекты, позиции элементов в них можно описать при помощи двух индексов. Первым в квадратных скобках `[]`, как обычно, следует номер строки, вторым --- номер столбца.
<img src="images/address-data.frame.png">
```{r}
dat[2, 2]
```
На месте индекса столбцов в `[]` квадратных скобках можно указать вектор имен переменных вместо их номеров.
```{r}
dat[, c("year", "test_passed")]
```
Во-вторых, оператор `$` позволяет выбрать одну из переменных по имени
```{r}
dat$year
```
Можно использовать комбинацию предыдущих техник.
```{r}
dat$test_passed[3]
```
#### Задание 17
Создайте датафрейм `year`, в котором будет две переменные: `month` и `season`.
```{r purl=FALSE, hide_button=TRUE}
# Названия месяцев возьмем из month.name
# А вектор season создадим сами
ss <- c(rep("winter", 2),
rep(c("spring", "summer", "autumn"), each = 3),
"winter")
# собираем в датафрейм
year <- data.frame(month = month.name, season = ss)
year
```
#### Задание 18
Выберите из датафрейма `year`
- строки, соответствующие весенним месяцам
- время года, которому соответствует июнь
- всю колонку, кодирующую сезон
```{r purl=FALSE, hide_button=TRUE}
# - строки, соответствующие весенним месяцам
year[3:5, ]
# - всю колонку, кодирующую сезон
year$season
year[, "season"]
year[, 2]
# - время года, которому соответствует июнь
year[6, 2]
year[6, "season"]
year$season[6]
```
## Списки (lists)
Списки позволяют хранить данные различных типов, и при этом разной длины.
<img src="images/lists.png">
```{r}
list(dat, mat, vect_num, colours)
```
Можно создавать именованные списки
```{r}
lst <- list(Dfr = dat, Matr = mat, Vect1 = vect_num, Vect2 = colours)
lst
```
Кстати, датафрейм можно определить как список векторов одинаковой длины.
### Адресация в списках
Для выбора данных из списков существует несколько вариантов действий.
1) Хорошо нам знакомый оператор `[]` работает и со списками. Он позволяет извлечь элементы списков в виде списков.
```{r}
lst[1:2] # список из двух элементов
lst[1] # список из одного элемента
```
2) Чтобы извлечь содержимое элемента списка, нужно использовать двойные квадратные скобки `[[]]`. С элементом списка дальше можно производить любые действия в обычном порядке.
```{r}
lst[[1]]
lst[[1]]$v2
```
3) При помощи оператора `$` можно извлечь элементы из именованного списка по их именам. Дальше с этими элементами можно проводить любые манипуляции.
```{r}
lst$Vect1
lst$Matr[, 1]
```
# Факторы (factors) --- особый тип данных
Факторы - это способ хранения дискретных (= категориальных данных). Например, если вы поймали 10 улиток и посмотрели их цвет. У большого количества улиток небольшое счетное количество возможных цветов.
```{r}
snail_colours <- c("red", "green", "green", "green", "yellow", "yellow", "yellow", "yellow")
snail_colours # это текстовый вектор.
```
Но цвет "желтый" обозначает одно и то же для каждой из улиток. Поэтому в целях экономии места можно записать цвета этих улиток в виде вектора, в котором численным значениям будут сопоставлены "этикетки" (называются "уровни" - levels) - названия цветов. Мы можем создать "фактор" цвет улиток.
```{r}
f_snail_alphabet <- factor(snail_colours)
f_snail_alphabet
```
Уровни этого фактора: `1 - green`, `2 - red`, `3 - yellow`. По умолчанию, R назначает порядок уровней по алфавиту. Можно изменить порядок (см. `help("factor")`). Нам это пригодится позже.
```{r}
f_snail_ryg <- factor(snail_colours, levels = c("red", "yellow", "green"))
f_snail_ryg
f_snail_yrg <- relevel(f_snail_ryg, ref = "yellow")
f_snail_yrg
```
#### Задание 19
Из вектора `season`, созданного ранее, создайте фактор `season_f` с алфавитным порядком уровней.
```{r purl=FALSE, hide_button=TRUE}
season
# Если создать фактор, не указав уровни, то порядок будет алфавитный
season_f <- factor(season)
season_f
```
#### Задание 20
Из вектора `season`, созданного ранее, создайте фактор `season_f` , в котором уровни следуют в том же порядке, что и времена года в году.
```{r purl=FALSE, hide_button=TRUE}
# Чтобы уровни следовали в нужном порядке, это нужно специально указать
season_f <- factor(season, levels = c("winter", "spring", "summer", "autumn"))
season_f
```
#### Задание 21
Из вектора `season`, созданного ранее, создайте фактор `season_f`, в котором уровни следуют в том же порядке, что и времена года в году, и называются первыми двумя буквами.
```{r purl=FALSE, hide_button=TRUE}
# Можно переименовать уровни
season_f <- factor(season,
levels = c("winter", "spring", "summer", "autumn"),
labels = c("wi", "sp", "su", "au"))
season_f
```