<commit_before>---
layout:     post
title:      "Основы R, типы данных часть 1."
date:       2015-08-25 12:00:00
author:     "<NAME>"
header-img: "img/test3.jpg"
---

# Язык программирования R

**R** - язык программирования предназначенный для статистическиз вычислений.
Является open-source реализацией языка S.

Преимущества R

- OpenSource
- Графические возможности
- Переносимость
- Расширения
- Сообщество

Недостатки

- Сложно изучить
- Легко написать код, который будет сложно поддерживать
- Плохо написанный код будет работать медленно

# Обзор edX: DAT204x Introduction to R

Абсолютно базовый курс по R. В курсе дают введение в синтаксис и знакомят с основными структурами данных в R: базовыми типами, массивами, списками, матрицами и datafram-ами.
Сначала предлагается посмотреть простое 5 минутное видео на заданную тему, потом ответить на такие-же простые вопросы по этому виде и пройти интерактивную лабораторную работу на https://campus.datacamp.com.
Я считаю что дать такие основы можно было и быстрее, сэкономив время для более прикладных примеров работы с R.
Курс подойдет как вводный для тек кто никогда не видел R и хочет с ним ознакомиться, либо тех кто уже знаком с R, но хочет быстрой пробежаться по основам.

#Основы

Простые вычисления и эксперементы можно проводить непосредственно в интерактивной консоли R.

Для присваивания в R используется `<-` вместо привычного `=`.

{% highlight R %}
#  Комментарии начинаются со знака слэша.
#  Создадим нескольк переменных
> width <- 5
> height <- 4

# Используем их для дальнейших вычислений
> square <- width * height
> perimeter <- 2 * (height + width)
> square
[1] 20
> perimeter
[1] 18

# Функция "rm" - отображает переменные в текущем окружении
> ls()
[1] "height" "width" "square" "perimeter"

# Функция "rm" - удаляет переменную
> rm(perimeter)
> ls()
[1] "height" "width" "square"
{% endhighlight %}

Для более сложных вычислении стоит создавать R-скрипты, файлы с расширением `.R`. 

{% highlight R %}
"Computer the square of circle."
r <- 3 
square <- pi * r ^ 2
square
{% endhighlight %}

Для запуска скритпа необходимо...

Справку по любой функции R, ее описание и список аргументов, можно получить напечатав `?` перед названием функции.

# Написать пример
{% highlight R %}
?sum
{% endhighlight %}


#Базовые типы данных

Логические значения `TRUE` и `FALSE` соответствуют типу данных `logical`.
Еще `logical` соответсвует значение `NA`, но сейчас это не важно.

Для определения типа данных переменной в R существует функция `class()`, которая принимает переменную и возвращает ее тип. 

{% highlight R %}
> class(TRUE)
[1] "logical"
{% endhighlight %}

`numeric` - числовой тип данных, поддерживает основные арифметические операции.

{% highlight R %}
> 2
[1] 2
> 2.5
[1] 2.5
> 3 + 8.4
[1] 11.4
> 7 ^ 4
[1] 2401
{% endhighlight %}

Частным случаем `numeric` является целочисленный тип `integer`. Для указания что число является целочисленным к нему необходимо дописать `L`.

{% highlight R %}
# Это numeric
> 2
# А это integer
> 2L
{% endhighlight %}

Все `integer` являются `numeric`, но не все `numeric` являются `integer`.

Стороковым типом данных является `character`, тут все просто.

{% highlight R %}
> "Hello, World!"
{% endhighlight %}

Другие базовые типы:
`double`: вещественное число с повышенной точностью;
`complex`: комплексное число;
`raw`: бинарная строка.

#Узнаем тип переменной и конвертируем типы

Для проверки относится ли переменная к какому-либо типу можно использовать функции вида `is.*`:

{% highlight R %}
# Возвращаясь к numeric и integer
is.numeric(5) # TRUE
is.numeric(5L) # TRUE
is.integer(3) # FALSE
is.integer(3L) # TRUE

# Другие типы
is.character("Mew!") # TRUE
is.logical(FALSE) # TRUE
{% endhighlight %}

Для конвертации типов используются функции вила `as.*`:

{% highlight R %}
# logical в numeric
as.numeric(TRUE) # 1
as.numeric(FALSE) # 0

# numeric в character
as.character(8) # "8"

# character в numeric
as.numeric("4.2") # 4.2

# character в integer
as.integer("4.2") # 4

# а так делать нельзя.
as.numeric("Test") # NA
{% endhighlight %}

#Векторы

Вектор в R это набор элементов одного типа.
Создать вектор можно с помощью функции `c()`, что является сокращением от combine.

{% highlight R %}
# Вектор строк
> suits <- c("spades", "hearts", "diamonds", "clubs")
> suits
[1] "hearts", "spades", "diamonds"

> is.vector(suits)
[1] TRUE

# Вектор чисел
> remain <- c(10, 11, 13, 8)
> remain
[1] 10, 15, 13, 8
{% endhighlight %}

Длину вектора можно найти с помощью функции `length()`

{% highlight R %}
> length(remain)
[1] 4<commit_msg>Update introduction to R, part 1<commit_after>---
layout:     post
title:      "Основы R, типы данных часть 1."
date:       2015-08-25 12:00:00
author:     "<NAME>"
header-img: "img/test3.jpg"
---

Я хотел написать обзор одного вводного англоязычного курса по R, а вышла серия статей начального уровня по языку программирования R.

#Язык программирования R

**R** - язык программирования предназначенный для статистических вычислений.
Является open-source реализацией языка S.

Преимущества R

- Open Source
- Графические возможности
- Переносимость
- Расширения
- Сообщество

Недостатки

- Сложно изучить
- Легко написать код, который будет сложно поддерживать
- Легко написать медленно работающий код

#Обзор edX: DAT204x Introduction to R

Абсолютно базовый курс по R. В курсе дают введение в синтаксис и знакомят с основными структурами данных в R: базовыми типами, массивами, списками, матрицами и datafram-ами.
Сначала предлагается посмотреть простое 5 минутное видео на заданную тему, потом ответить на такие-же простые вопросы по этому виде и пройти интерактивную лабораторную работу на https://campus.datacamp.com.
Я считаю что дать такие основы можно было и быстрее, сэкономив время для более прикладных примеров работы с R, например показать работу с файлами, или применение функций для анализа данных.
Курс подойдет как вводный для тек кто никогда не видел R и хочет с ним ознакомиться, либо тех кто уже знаком с R, но хочет быстрой пробежаться по основам.

#Основы

`R` доступен для всех современных ОС, и поставляется с полноценным `REPL`.
Интерактивную консоль можно использовать для простых эксперементов и в качестве калькулятора.

Первое отличие `R` от привычных языков программирования состоит в том, что в качестве оператора присваивания в нем часто используется `<-` вместо `=`. На самом деле и `=` работает, отличие состоит в области видимости переменной.
В разных styleguid-ах можно найти противоположные рекомендации по использованию операторов присваивания, но в сообществе `R` разработчиков более распространен первый вариант '<-', его я и буду использовать в данном цикле статей. 

{% highlight R %}
#  Комментарии начинаются со знака слэша.
#  Создадим нескольк переменных
> width <- 5
> height <- 4

# Используем их для дальнейших вычислений
> square <- width * height
> perimeter <- 2 * (height + width)
> square
[1] 20
> perimeter
[1] 18

# Функция "ls" - отображает переменные в текущем окружении
> ls()
[1] "height" "width" "square" "perimeter"

# Функция "rm" - удаляет переменную из окружения
> rm(perimeter)
> ls()
[1] "height" "width" "square"
{% endhighlight %}

Для более сложных вычислении стоит создавать R-скрипты, файлы с расширением `.R`. 

{% highlight R %}
"Computer the square of circle."
r <- 3 
square <- pi * r ^ 2
square
{% endhighlight %}

Выполнить такой файл можно командой `Rscript square.R`. Или можно просто поставить IDE, например [RStudio](https://www.rstudio.com/), open source версия которой доступна для всех платформ.

Получить дополнительную информацию по какой-либо функции можно воспользоваться встроенной документацие `R`, для этого необходимо перед именем функции напечатать `?`, после чего можно прочитать описание функции, список аргументов и посмотреть примеры. Или просто поискать в интернете.

{% highlight R %}
> ?sum
Sum of Vector Elements

Description
sum returns the sum of all the values present in its arguments.

Usage
sum(..., na.rm = FALSE)
Arguments

... 
numeric or complex or logical vectors.
na.rm   
logical. Should missing values (including NaN) be removed?
Details

This is a generic function: methods can be defined for it directly or via the Summary group generic. For this to work properly, the arguments ... should be unnamed, and dispatch is on the first argument.
{% endhighlight %}

#Базовые типы данных

Самым простым являются логичческие тип данных. Логические значения `TRUE` и `FALSE` соответствуют типу данных `logical`. Еще `logical` соответсвует значение `NA`, но сейчас это не важно.

Для определения типа данных переменной в R существует функция `class()`, которая принимает переменную и возвращает ее тип. 

{% highlight R %}
> class(TRUE)
[1] "logical"
{% endhighlight %}

Для логических переменных определены основные логические операции.

{% highlight R %}
> TRUE && (FALSE || TRUE)
[1] TRUE
> xor(TRUE, FALSE)
[1] TRUE
> !TRUE
[1] FALSE
{% endhighlight %}

`numeric` представляет числовой тип данных и поддерживает основные арифметические операции.

{% highlight R %}
# Ничего интересного
> 1984
[1] 1984
> 2.7118
[1] 2.7118
> 3 + 8.4
[1] 11.4

# Возведение в степень
> 7 ^ 4
[1] 2401
# Остаток деления, mod
> 9 %% 2
[1] 1
# Целочисленное деление, div
> 9 %/% 2
[1] 4
{% endhighlight %}

Частным случаем `numeric` является целочисленный тип `integer`. Для указания что число является целочисленным к нему необходимо дописать `L`.

{% highlight R %}
# Это numeric
> 2
# А это integer
> 2L
{% endhighlight %}

Все `integer` являются `numeric`, но не все `numeric` являются `integer`.

Для хранения строк есть тип данных `character`, тут все просто.

{% highlight R %}
> "Hello, World!"
[1] "Hello World!"

# Конкатенация строк производится функцией "paste", "+" не работает для строк!
> name <- "John"
> surname <- "Galt"
> paste(name, surname)
[1] "<NAME>"

# Получаем подстроку
> substr("Select this word!", start = 8, stop = 16)
[1] "this word"

# Заменяем подстроку
> sub("problem", "dream!", "I have a problem")
[1] "I have a dream!"

# Печатаем строку
> sprintf("Who is has %s?", "<NAME>")
[1] "Who is has <NAME>??"
{% endhighlight %}

Другие базовые типы:

- `double`: вещественное число с повышенной точностью;
- `complex`: комплексное число;
- `raw`: бинарная строка.

#Определяем тип переменной и конвертируем типы

Что бы проверить, принадлежит ли переменная к какому-либо типу можно использовать функции вида `is.*`:

{% highlight R %}
# Возвращаясь к numeric и integer
> is.numeric(5)
[1] TRUE
> is.numeric(5L)
[1] TRUE
> is.integer(3)
[1] FALSE
> is.integer(3L)
[1] TRUE

##Другие типы
> is.character("Mew!")
[1] TRUE
> is.logical(FALSE)
[1] TRUE
{% endhighlight %}

Для конвертации типов используются функции вида `as.*`:

{% highlight R %}
# logical в numeric
> as.numeric(TRUE)
[1] 1
> as.numeric(FALSE)
[1] 0

# numeric в character
> as.character(8)
[1] "8"

# character в numeric
> as.numeric("4.2")
[1] 4.2

# character в integer
> as.integer("4.2")
[1] 4

# а так делать нельзя.
> as.numeric("Test")
[1] NA
Warning message:
NAs introduced by coercion 
{% endhighlight %}

#Векторы

В `R` вектор это набор элементов одного типа.
Создать вектор можно с помощью функции `c()`, что является сокращением от *combine*.

# использовать другой пример, например со странами, или книгами
{% highlight R %}
# Вектор строк
> suits <- c("spades", "hearts", "diamonds", "clubs")
> suits
[1] "hearts", "spades", "diamonds"

> is.vector(suits)
[1] TRUE

# Вектор чисел
> remain <- c(10, 11, 13, 8)
> remain
[1] 10, 15, 13, 8
{% endhighlight %}

Длину вектора можно найти с помощью функции `length()`

{% highlight R %}
> length(remain)
[1] 4
{'fraction_non_alphanumeric': 0.10602409638554217, 'fraction_numerical': 0.019621342512908778, 'mean_word_length': 4.380092592592592, 'pattern_counts': {'":': 0, '<': 29, '<?xml version=': 0, '>': 78, 'https://': 3, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6194184', 'n_tokens_mistral': 4820, 'n_tokens_neox': 5225, 'n_words': 1481}