8  Базові типи даних R

Автор

Юрій Клебан

Опубліковано

3/18/23

8.1 Типізація в R

Усі мови програмування мають власну типізацію даних з якими працюють. Тип даних - це набір властивостей певних об’єктів та операцій, що можна з ними виконувати. Так, наприклад, з цілими числами можна виконувати арифметичні операції додавання, віднімання та інші. Набори символів (простими словами текст) зазвичай можуть використовуватися для пошуку у них елементів, редагування (шляхом видалення частини існуючого або додавання нового тексту), склеювання та розділення на частини.

У R, на відміну від строго типізованих мов програмування, тип даних визначається на основі поточного значення елемента і може змінюватися у процесі виконання.

Розгялнемо приклад коду з мови програмування C# (мова родом із C/Java):

int a = 10;
a = "some text";

Подібний код у C# передбачає створення нової змінної a типу int (integer - ціле число), а потім відбувається присвоєння для a текстового фрагмента (тип string у С#). Такий код не буде запущено і виникне помилка компіляції.

Розглянемо приклад коду з R:

a <- 10
a <- "some text"
a
[1] "some text"

Такий код виконається і на консоль буде виведено some text, адже у 1 першому рядку було присвоєно ціле число, у другому - текст. Таким чином R має динамічну типізацію, що дозволяє у ту ж саму змінну записати значення різних типів. Проте варто пам’ятати, що попереднє значення буде втрачено.

До базових типів даних у R варто віднести:

  • Числа з дробовою частиною (decimal numbers), як наприклад, 4.0, 15.214, що називаються numeric(s).
  • Натуральні числа (natural numbers), як наприклад, 4, 15, що називаються integer(s).
  • Логічні значення (boolean values), тобто TRUE та FALSE (які також можна скорочено записувати T та F), що називаються logical.
  • Текст або рядки (string values), як наприклад, "Hello", "12 is number", що називаються character(s).

Оголосимо для прикладу три змінні: my_numeric - число, my_character - текст, my_logical - логічне значення.

my_numeric <- 5
my_character <- "universe"
my_logical <- FALSE

Замінимо значення my_character <- "5" та спробуємо знайти суму значень:

my_character <- "5"
my_sum <- my_numeric + my_character

У результаті виклання даного коду ми отримаємо помилку, адже значення 5 та "5" є елементами різних типів даних, перевіримо типи за допомогю функції class():

class(5)
[1] "numeric"
class("5")
[1] "character"

Виконання коду class(5) показує нам, що 5є значенням числового типу даних numeric, а class("5") відповідає тексту character, тому арифметична операція додавання між цими значеннями неможлива.

8.2 Перевірка та приведення типів даних

У випадку коли тип даних потрібно визначити у процесі виконання програми/коду та перетворити значення використовується приведння типів даних.

Приведення типів даних - операція перетворення значення з одного типу даних в інший. Важливо памятати, що не завжди приведення типів даних може бути здійснено. Так, наприклад, значення "5" (character) можна досить просто привести до 5 (numeric), проте "five" не буде зрозумілим для інтерпритатора.

Для перевірки належності елемента до певного типу даних використовують спеціальну функцію is.назва_типу(значення). Ця функція повертає TRUE, якщо елемент належить даному типу і FALSE, якщо не належить.

Розглянемо приклад:

my_numeric <- 5
my_character <- "five"
my_logical <- FALSE

is.numeric(my_numeric)
[1] TRUE
is.character(my_numeric)
[1] FALSE

Для перетворення типу даних можна скористатися функцією as.назва_типу(значення). У результаті виконання функції буде повернуто значення потрібного типу або пусте значення NA, якщо таке приведення не є можливим:

a <- 5
b <- "10"
c <- "10, 20"
as.numeric(b)
[1] 10
as.numeric(c)
Warning: NAs introduced by coercion
[1] NA

Результат виконання функцій можна записувати у змінні і використовувати у наступних обчисленнях:

a <- 5
b <- "10"
b <- as.numeric(b)
a + b
[1] 15
number <- as.integer(54)
typeof(number)
[1] "integer"
class(number)
[1] "integer"

Повний перелік типів та методів перевірки і приведення їх типів ображений нижче:

Базові типи даних R, методи перевірки та приведення
Назва типу Метод перевірки типу Метод приведення типу
Array is.array() as.array()
Character is.character() as.character()
Complex is.complex() as.complex()
Dataframe is.data.frame() as.data.frame()
Double is.double() as.double()
Factor is.factor() as.factor()
List is.list() as.list()
Logical is.logical() as.logical()
Matrix is.matrix() as.matrix()
Numeric is.numeric() as.numeric()
Raw is.raw() as.raw()
Time series (ts) is.ts() as.ts()
Vector is.vector() as.vector()

8.3 Приклади розв’язання завдань

Завдання 1. Сума введених чисел

Знайти суму введених з клавіатури чисел. Для введення інформації скористатися функцією readline(prompt = "Text").

Розв’язання:

# works on console and notebook / run this code line by line
a <- readline(prompt = "Enter A:") # read a
b <- readline(prompt = "Enter B:") # read b

a <- as.numeric(a) # convert character to numeric
b <- as.numeric(b) # convert character to numeric

sum <- a + b
sum

Результат виконання:

Enter A: 10
Enter B: 45
55