Справочник по базовым функциям R

В статье представлены базовые функции, изучаемые в курсе “Бизнес-аналитика в R”, которые помогут вам в написании собственных скриптов

Создание объектов

c(элемент1, элемент2, …) – (от concatenation – объединение, слияние) объединяет перечень значений(аргументы) в один вектор определенного типа.

a <- с(1, 2, 3)

> a
[1] 1 2 3

data.frame(вектор1, вектор2, …) – создает таблицу данных. Вместо векторов могут использоваться также отдельные таблицы. Все столбцы одинаковой длины и в каждом столбце должны быть данные одного типа(т.е. вектор).

df <- data.frame("Товар" = c("Лайм", "Изюм", "Слива", "Киви", "Персик", "Вишня", "Тыква", "Манго"), 
                "Цена" = c(25, 31, 30, 15, 47, 27, 44, 50),
                "Продавец" = c("Паша","Паша","Давид","Саша", "Саша", "Паша", "Давид", "Паша"))

> df
    Товар Цена Продавец
1    Лайм   25     Паша
2    Изюм   31     Паша
3   Слива   30    Давид
4    Киви   15     Саша
5  Персик   47     Саша
6   Вишня   27     Паша
7   Тыква   44    Давид
8   Манго   50     Паша

от:до – генерирует последовательность чисел от и до с шагом 1.

a <- 1:3

> a
[1] 1 2 3
a <- 5:1 

> a
[1] 5 4 3 2 1

Аналогичным примером для вектора от 1 до 3, может служить такая конструкция:

a <- c(1:3)

> a
[1] 1 2 3

rbind(таблица1, таблица2, …) — объединяет 2 и более датафрейма по строкам, если есть совпадающий столбец.

df2 <- data.frame("Товар" = c("Яблоко"), 
                  "Цена" = c(15),
                  "Продавец" = c("Саша"))
rbind(df, df2)

>
   Товар Цена Продавец
1   Лайм   25     Паша
2   Изюм   31     Паша
3  Слива   30    Давид
4   Киви   15     Саша
5 Персик   47     Саша
6  Вишня   27     Паша
7  Тыква   44    Давид
8  Манго   50     Паша
9 Яблоко   15     Саша

merge(таблица1, таблица2, by = “по_колонке”) — объединяет таблицы, если в таблицах одинаковых колонок более одного то указывается по какой именно следует объединить.

df2 <- data.frame("Товар" = c("Яблоко", "Груша"), 
                  "Цена" = c(15, 25),
                  "Продавец" = c("Саша", "Саша"))
df3 <- data.frame("Кол-во продаж" = c(5, 8),
                  "Продавец" = c("Саша", "Давид"))
merge(df2, df3, by = "Продавец")

>
  Продавец  Товар Цена Кол.во.продаж
1     Саша Яблоко   15             5
2     Саша  Груша   25             5

by.x = “по_колонке_в_1_таблице”, by.y = “по_колонке_2_таблицы” — применяется, если в двух таблицах нет идентичных колонок.

df2 <- data.frame("Товар" = c("Яблоко", "Груша"), 
                  "Цена" = c(15, 25),
                  "Продавец" = c("Саша", "Саша"))
df3 <- data.frame("Кол-во продаж" = c(5, 8),
                  "Работник" = c("Саша", "Давид"))
merge(df2, df3, by.x = "Продавец", by.y = "Работник")

>
  Продавец  Товар Цена Кол.во.продаж
1     Саша Яблоко   15             5
2     Саша  Груша   25             5

colnames(таблица) <- c(“название_для_1_столбца”, “для_2”, “для_3”, …) — устанавливает таблице данных конкретные заголовки для столбцов.

df2 <- data.frame(c("Яблоко", "Груша"), 
                  c(15, 25),
                  c("Саша", "Саша"))
df2

>
  c..Яблоко....Груша.. c.15..25. c..Саша....Саша..
1               Яблоко        15              Саша
2                Груша        25              Саша

# Видно что по умолчанию названия столбцов формируется из его содержимого

colnames(df2) <- c("Товар", "Цена", "Продавец")
df2

>
   Товар Цена Продавец
1 Яблоко   15     Саша
2  Груша   25     Саша

x <- colnames(таблица) — можно также вызывать перечень имён, и записывать их как отдельный объект.

x <- colnames(df2)
x

> [1] "Товар"    "Цена"     "Продавец"

colnames(таблица)[номер_столбца] <- “новое_название” — можно переписывать отдельные названия столбцов.

colnames(df2)

> [1] "Товар"    "Цена"     "Продавец"


colnames(df2)[2] <- "Цена(в руб.)"
colnames(df2)

> [1] "Товар"   "Цена(в руб.)" "Продавец" 

Индексирование

Извлечение столбцов из таблицы данных по названию:

таблица$название_столбца
или
таблица[,”название_столбца”]
или
таблица[[“название_столбца”]]

df$"Товар"

> [1] Лайм   Изюм   Слива  Киви   Персик Вишня  Тыква  Манго 
Levels: Вишня Изюм Киви Лайм Манго Персик Слива Тыква


df$Товар

> [1] Лайм   Изюм   Слива  Киви   Персик Вишня  Тыква  Манго 
Levels: Вишня Изюм Киви Лайм Манго Персик Слива Тыква
df[, "Товар"]

> [1] Лайм   Изюм   Слива  Киви   Персик Вишня  Тыква  Манго 
Levels: Вишня Изюм Киви Лайм Манго Персик Слива Тыква
df[["Товар"]]

> [1] Лайм   Изюм   Слива  Киви   Персик Вишня  Тыква  Манго 
Levels: Вишня Изюм Киви Лайм Манго Персик Слива Тыква


df["Товар"]

>
   Товар
1   Лайм
2   Изюм
3  Слива
4   Киви
5 Персик
6  Вишня
7  Тыква
8  Манго

Сортировка

По возрастанию:

таблица[order(таблица$колонка), ]

По убыванию:

таблица[order(-таблица$колонка), ]

df[order(-df$Цена), ]

>
   Товар Цена Продавец
8  Манго   50     Паша
5 Персик   47     Саша
7  Тыква   44    Давид
2   Изюм   31     Паша
3  Слива   30    Давид
6  Вишня   27     Паша
1   Лайм   25     Паша
4   Киви   15     Саша

Извлечение с логическим условием

Из вектора:

вектор[вектор > 100]
или
вектор[вектор > 10 & вектор < 50]

a <- 1:7

> a[a < 5]
[1] 1 2 3 4

Из таблицы:

таблица[таблица$столбец > 100, ]

df[df$Цена < 40 & df$Цена >= 30, ]

> 
  Товар Цена Продавец
2  Изюм   31     Паша
3 Слива   30    Давид

Проверка вхождения

вектор1 %in% вектор2 — проверка вхождения вектора1 в вектор2.

x <- c(1, 2, 3, 4)
y <- c(3, 4, 5, 6)
x %in% y

> [1] FALSE FALSE  TRUE  TRUE

Работа с датами

as.Date(вектор, format = “код_формата”) — переводит текстовый вектор в даты R выбранного формата.

format(вектор, format = “код_формата”) — переводит вектор с датами R в другой формат.

%a – сокращенный день недели
%A – полный день недели
%b – сокращенный месяц текстом
%B – полный месяц текстом
%d – день месяца
%j – день года 001-366
%m – месяц 01-12
%w – день недели 0-6, ВС как 0
%W – неделя года 00-53 (неделя с ПН)
%D – дата в формате %m/%d/%y
% y – год двумя числами
% Y – год полностью

Пн, Вт
Понедельник, Вторник
Сен, Окт
Сентябрь, Октябрь
27, 07
148, 188
05, 07
0, 4
21, 27
05/27/84, 07/07/05
19
2019

strDates <- c("01/05/1965", "16/08/1975")
as.Date(strDates, "%d/%m/%Y")

> [1] "1965-05-01" "1975-08-16"


today <- Sys.Date() # текущая дата
format(today, format="%B %d %Y")

> [1] "июня 16 2019"

Работа с текстом

gsub(“паттерн”, “замена”, вектор, fixed = TRUE) — ищет в векторе совпадения с паттерном и заменяет их, если fixed = TRUE, то паттерн воспринимается ровно так как он написан.

days <- c("ПН", "ВТ", "СР", "ЧТ", "ПТ", "СБ", "ВС")
gsub("СБ|ВС", "выходной", days, fixed = FALSE)

> [1] "ПН" "ВТ" "СР" "ЧТ" "ПТ" "выходной" "выходной"

grep(“паттерн”, вектор, fixed = TRUE, value = FALSE) — ищет в векторе совпадения с паттерном и выводит индексы соответствующих строк. Если fixed = TRUE, то паттерн воспринимается ровно так, как он написан. Если value = TRUE, то выводит не индексы строк, а сами совпавшие значения.

days <- c("ПН", "ВТ", "СР", "ЧТ", "ПТ", "СБ", "ВС")
grep("СБ|ВС", days, fixed = FALSE)

> [1] 6 7

grepl(“паттерн”, вектор, fixed = TRUE) — Работает как grep(), но выводит TRUE/FALSE для каждого совпавшего/не совпавшего с паттерном элемента вектора.

days <- c("ПН", "ВТ", "СР", "ЧТ", "ПТ", "СБ", "ВС")
grepl("СБ|ВС", days, fixed = FALSE)

> [1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE

Чтение и запись

read.csv(“название_файла.csv”, …) – считывает файл с данными (файл должен лежать в той же папке, что и код) и создает из него таблицу данных (dataframe).

Аргументы:

sep = “”  (от слова separator – разделитель) в csv-файлах разделителем служит запятая (sep = “,”).

header = TRUE— устанавливает первую строки считываемого файла как заголовки столбцов, иначе header = FALSE.

skip = n — используется для того, чтобы пропустить первые n строк файла при считывании.

read.csv("Отчёт сети за месяц.csv", 
                   header = TRUE,  
                   sep = ";", 
                   dec = ",", 
                   na.strings = "#Н/Д", 
                   stringsAsFactors = FALSE, 
                   fileEncoding = "cp1251")

write.csv(название_таблицы, file = “название_файла.csv”) – сохраняет таблицу данных в виде отдельного файла в папку с кодом текущего проекта.

write.csv(df, file = "report.csv")

Общая работа с объектами

str(object) — внутренняя структура объекта object

str(df)

> 'data.frame':	8 obs. of  3 variables:
 $ Товар   : Factor w/ 8 levels "Вишня","Изюм",..: 4 2 7 3 6 1 8 5
 $ Цена    : num  25 31 30 15 47 27 44 50
 $ Продавец: Factor w/ 3 levels "Давид","Паша",..: 2 2 1 3 3 2 1 2

summary(object) — общая информация об объекте object

summary(df)

>
     Товар        Цена        Продавец
 Вишня  :1   Min.   :15.00   Давид:2  
 Изюм   :1   1st Qu.:26.50   Паша :4  
 Киви   :1   Median :30.50   Саша :2  
 Лайм   :1   Mean   :33.62            
 Манго  :1   3rd Qu.:44.75            
 Персик :1   Max.   :50.00            
 (Other):2   

head(object) — посмотреть начальные строки объекта

head(object, n = 10) — указывает сколько верхних строк показывать

head(df)

>
   Товар Цена Продавец
1   Лайм   25     Паша
2   Изюм   31     Паша
3  Слива   30    Давид
4   Киви   15     Саша
5 Персик   47     Саша
6  Вишня   27     Паша

tail(object) — посмотреть последние строки объекта

tail(df)

>
   Товар Цена Продавец
3  Слива   30    Давид
4   Киви   15     Саша
5 Персик   47     Саша
6  Вишня   27     Паша
7  Тыква   44    Давид
8  Манго   50     Паша

unique(вектор) — выводит перечень уникальных значений из
вектора(столбца таблицы)

unique(df$Продавец)

> [1] Паша Давид Саша 
Levels: Давид Паша Саша

length(вектор) — выводит количество элементов в векторе.

length(df$Продавец)

> [1] 8

Часто применяется в комбинации:
length(unique(вектор))

length(unique(df$Продавец))

> [1] 3

sum(вектор) — сумма всех значений вектора.

sum(df$Цена)

> [1] 269

Если в векторе содержатся пропущенные значения, добавляется na.rm = TRUE.

a <- c(1,NA,5)
sum(a, na.rm = TRUE)

> [1] 6

mean(вектор) — среднее значение по вектору.

mean(df$Цена)

> [1] 33.625

Условный оператор

Аналог функции Exel =ЕСЛИ()  

ifelse(лог_выражение, значение_для_TRUE, значение_для_FALSE)

a <- c(5, 7, 2, 9, 6)
ifelse(a %% 2 == 0, "Четное", "Нечетное")

> [1] "Нечетное" "Нечетное" "Четное" "Нечетное" "Четное" 

Comments are closed.