ggplot2 и esquisse.
Пакет esquisse предоставляет вам Addon для RStudio "ggplot2 builder", который является графическим интерфейсом для генерация кода построения ggplot графиков. Пример работы Addon на изображении к посту.
#видео_уроки_по_R
Автор канала Алексей Селезнёв, руководитель отдела аналитики в Netpeak, автор R пакетов: ryandexdirect, rfacebookstat и др. В канале публикуются статьи, доклады, новости, заметки по языку R.
ggplot2 и esquisse.
Пакет esquisse предоставляет вам Addon для RStudio "ggplot2 builder", который является графическим интерфейсом для генерация кода построения ggplot графиков. Пример работы Addon на изображении к посту.
#видео_уроки_по_Rwakefield предоставляет удобный интерфейс для генерации наборов данных. Ядром пакета является функция r_data_frame(), которая создаёт таблицу со случайными данными. Внутри этой функции с помощью аргумента n, вы указываете необходимое количество наблюдений (строк), и далее используете 49 дополнительных функций, для генерации различных переменных (столбцов).
Список функций для генерации переменных:
● age - возраст
● animal - животное
● answer - ответ на вопрос (да / нет)
● area - тип населённого пункта, пригород, город, село
● car - марка машины
● children - к-во детей
● coin - монета (орёл / решка)
● color - цвет
● date_stamp - дата
● death - логический вектор смертей
● dice - бросок игрового кубика
● dna - ДНК (Гуанин, Аденин, Тимин, Цитозин)
● dob - Дни рождения
● dummy - Случайный фиктивный закодированный (0/1) вектор
● education - Уровень образования
● employment - Тип занятости
● eye - Цвет глаз
● grade - Рейтинг
● grade_level - Cлучайный вектор уровней оценок.
● group - Вектор бинарных групп (например, контроль/лечение)
● hair - Цвет волос
● height - Рост
● income - доход
● internet_browser - Интернет браузер
● iq - Уроыень IQ
● language - Язык
● level -Случайный вектор целочисленных уровней
● likert - Случайный вектор ответов типа Лайкерта.
● lorem_ipsum - (псевдо) случайный текст lorem ipsum
● marital - Семейный статус
● military - Вектор родов войск
● month - Название месяца
● name - Имя
● normal - Нормальное распределение
● political - Вектор политических партий
● race - Раса
● religion - Регион
● sat - Генерация случайного нормального вектора теста на школьные способности (SAT)
● sentence - Предложение
● sex - Пол
● sex_inclusive - Вектор небинарных полов
● smokes - Логическое, курит или нет
● speed - Скорость
● state - Штат США
● string - Случайная строка символов
● upper - Случайная буква
● valid - Логическое истина или ложь
● year - Год
● zip_code - Почтовый индекс
Так же вы можете передавать собственные функции, генерирующие векторы, единственное условие, данная функция должна иметь аргумент n, ограничивающий длину генерируемого вектора.
Пример генерации выборки:
library(wakefield)
library(dplyr)
# функция генерации отделов
department <- function(
n,
x = c("Sales", "Marketing", "Developores", "Finance", "Managment"),
prob = c(0.5, 0.2, 0.1, 0.15, 0.05),
name = "Department")
{
if (missing(n)) stop("`n` is missing")
out <- sample(x = x, size = n, replace = TRUE, prob = prob)
out <- factor(out, levels = x)
varname(out, name)
}
# генерируем табдицу сотрудников
staff <- r_data_frame(
n = 60,
id,
name,
gender,
age,
employment,
department,
income,
car,
date_stamp(start = as.Date('2020-01-01'), k = 700, by = 'days', random = T, name = 'StartWorks'),
valid(prob = c(0.1, 0.9), name = 'IsActive')
) %>%
r_na(cols = 8, prob= .25)
#заметки_по_Rshinycssloaders позволяет вам добавить такой спиннер-информер на любой визуальный элемент. Для добавления просто заверните нужный визуальный элемент в функцию withSpinner().
Пример кода:
library(shiny)
ui <- fluidPage(
actionButton("go", "Go"),
shinycssloaders::withSpinner(
plotOutput("plot")
)
)
server <- function(input, output) {
output$plot <- renderPlot({
input$go
Sys.sleep(1.5)
plot(runif(10))
})
}
shinyApp(ui, server)
Результат работы видно на изображении к посту. Как по мне для пользователя такой информер будет выглядеть привлекательнее, чем просто потускневший график.
Аргумент type позволяет выбрать один из типов анимации загрузки. Посмотреть как выглядит каждый из них можно по ссылке.
Аргументы color и size позволяют изменять цвет и размер анимации соответвенно.
Опции spinner.type, spinner.color, spinner.size позволяют вам глобально задавать настройки анимации для всех визуальных элементов, обёрнутых функцией withSpinner().dplyr / siuba, и просто с помощью альтернативного варианта на pandas.
1. dplyr
example_df %>%
mutate(
a_dbl = a * 2,
b_tri = b * 3,
c_half = c / 2,
b_min_c = b - c) %>%
filter(b_min_c > 3) %>%
group_by(category) %>%
summarize(
avg_a_dbl = mean(a_dbl),
avg_b_tri = mean(b_tri),
avg_c_half = mean(c_half),
avg_b_min_c = mean(b_min_c)
)
2. siuba
(
example_df
>> mutate(
a_dbl = _.a * 2,
b_tri = _.b * 3,
c_half = _.c / 2,
b_min_c = _.b - _.c )
>> filter(_.b_min_c > 3)
>> group_by(_.category)
>> summarize(
avg_a_dbl = _.a_dbl.mean(),
avg_b_tri = _.b_tri.mean(),
avg_c_half = _.c_half.mean(),
avg_b_min_c = _.b_min_c.mean() )
)
3. pandas (1)
(
example_df
.assign(a_dbl = example_df.a * 2)
.assign(b_tri = example_df.b * 3)
.assign(c_half = example_df.c / 2)
.assign(b_min_c = example_df.b - example_df.c)
.query('b_min_c > 3')
.groupby('category', as_index=False)
.agg(
avg_a_dbl = pd.NamedAgg(column='a_dbl', aggfunc=np.mean),
avg_b_tri = pd.NamedAgg(column='b_tri', aggfunc=np.mean),
avg_c_half = pd.NamedAgg(column='c_half', aggfunc=np.mean),
avg_b_min_c = pd.NamedAgg(column='b_min_c', aggfunc=np.mean)
)
)
3. pandas (2)
example_df['a_dbl'] = example_df['a'].mul(2)
example_df['b_tri'] = example_df['b'] * 3
example_df['c_half'] = example_df['c'].div(2)
example_df['b_min_c'] = example_df['b'].sub(example_df['c'], axis = 0)
example_df = example_df[example_df['b_min_c'] > 3]
example_df['avg_a_dbl'] = example_df['a_dbl'].groupby(example_df['category']).transform('mean')
example_df['avg_b_tri'] = example_df['b_tri'].groupby(example_df['category']).transform('mean')
example_df['avg_c_half'] = example_df['c_half'].groupby(example_df['category']).transform('mean')
example_df['avg_b_min_c'] = example_df['b_min_c'].groupby(example_df['category']).transform('mean')
Синтаксис dplyr / siuba очень похож, а pandas, хоть и выполняет те же манипуляции, но имеет другой синтаксис.
Смотрите так же:
- Какой язык выбрать для работы с данными R или Python? Оба! Мигрируем с pandas на tidyverse и data.table и обратно
#заметки_по_Rknitr::spin() позволяет выполнить такую конвертацию, при этом необходимо учитывать следующие правила синтаксиса конвертации:
● Roxygen комментарии будут рассматриваться как обычный текст.
● Комментарий, начинающийся с #+, считается заголовком блока Knitr . Например, knitr::spin() переводит комментарий #+ label, fig.width=5 в заголовок чанка {r label, fig.width=5}.
● Код R формы {{ code }}преобразуется во встроенное выражение R в R Markdown.
● YAML шапка также может быть написана в начале R-скрипта в комментариях roxygen.
● Любой текст между /* и */ будет игнорироваться.
Привет R скрипта:
#' ---
#' title: "A report generated from a pure R script"
#' output:
#' pdf_document:
#' keep_tex: true
#' ---
#'
#' This is a report generated by `knitr::spin()`.
#'
#' Let's try some **knitr** options:
#+ echo=FALSE, fig.width=7
# This is a normal R comment.
plot(cars)
#' Now write an inline value. We know the value of $\pi$ is
{{ pi }}
#' .
#'
#' Finally please note that all roxygen comments are
#' optional. You do not need chunk options, either,
#' unless you want more control over the output
#' elements such as the size of plots.
# /* Write comments between /* and */ like C comments:
Sys.sleep(60)
# */
Функция knitr::spin() преобразует данный код в Rmarkdown документ следующего формата:
---
title: "A report generated from a pure R script"
output:
pdf_document:
keep_tex: true
---
This is a report generated by `knitr::spin()`.
Let's try some **knitr** options:
```{r echo=FALSE, fig.width=7}
# This is a normal R comment.
plot(cars)
```
Now write an inline value. We know the value of $\pi$ is
``r pi ``
.
Finally please note that all roxygen comments are
optional. You do not need chunk options, either,
unless you want more control over the output
elements such as the size of plots.
2. Rmarkdown -> R
Обратная операция, т.е. преобразования Rmarkdown в R скрипт, реализуется функцией knitr::purl(). Данная функция принимает в качестве первого аргумента путь к Rmarkdown документы, и второй аргумент позволяет управлять тем, что из Rmarkdown документа будет отображено в файле с R скриптом.
# Извлечение только R кода
knitr::purl("script.R", documentation = 0L)
# Извлечение R кода и настроек чанков
knitr::purl("script.R", documentation = 1L)
# Извлечение всего содержимого Rmarkdown документа
knitr::purl("script.R", documentation = 2L)
#заметки_по_Rclass(X)=='foo'. Самая большая проблема этого подхода заключается в том, что в большинстве случаев он сработает, например:
class(mtcars) == 'data.frame' [1] TRUEТ.е. когда объект имеет простейшую иерархию классов, то этот подход будет работать, но если мы преобразуем таблицу
mtcars в tibble, то его иерархия классов будет уже более сложной, и вы получите немного неожиданный ответ:
class(tibble::tibble(mtcars)) == 'data.frame' [1] FALSE FALSE TRUEЭто связано с тем, что
tibble имеет унаследованные классы:
class(tibble::tibble(mtcars)) [1] "tbl_df" "tbl" "data.frame"Если вы используете R 4.2.0 и выше, и данное логическое выражение будете использовать внутри конструкции
if, то вы вообще получите ошибку.
Другим подходом может быть использование оператора %in%:
'data.frame' %in% class(tibble::tibble(mtcars)) [1] TRUEЛогически этот подход будет работать корректно даже с объектами, которые имеют сложную иерархию классов. Тем не менее, для операции проверки принадлежности объекта определённому классу существует специальная функция :
inherits(tibble::tibble(mtcars), 'data.frame') [1] TRUE#заметки_по_R
worrrd можно создавать кроссворды. Но, помимо кроссвордов данный пакет позволяет создавать игры "Поиск слов".
По прошлому примеру я создам поле для игры "Поиск слов", в котором надо найти глаголы dplyr.
Пример:
library(worrrd)
# вектор слов
words <- c("filter", "mutate", "arrange", "summarise", "group_by", "left_join")
# создаём объект поля
x <- wordsearch(words, r = 20, c = 20)
# отображааем поле
plot(x, solution = TRUE)
#заметки_по_RR CMD BATCH опциях. Этим сообщением я решил немного дополнить информацию изложенную в видео уроке.
Синтаксис:
R CMD <options> <r file>Список основных опций команды R CMD BATCH: ●
--help - Вывести справку
● --version - Вывести информацию о версии R
● --encoding=enc - Позволяет указать кодировку, которая будет использоваться для ввода с консоли или stdin.
● --save / --no-save - Следует ли сохранять наборы данных в конце сеанса R.
● --no-environ - Игнорировать при запуске скрипта файл .Renviron со списком переменных среды.
● --no-site-file -Игнорировать при запуске файл Rprofile.site,
● --no-init-file - Игнорировать при запуске пользовательский файл Rprofile
● --restore / --no-restore / --no-restore-data - Должно ли подгружаться сохранённое ранее рабочее окружение при запуске скрипта
● --no-restore-history - Должен ли загружаться файл .Rhistory при запуске
● --vanilla - Сочетание опций --no-save, --no-environ, --no-site-file, --no-init-file и --no-restore
Пример:
R CMD BATCH --no-restore --no-init-file script.R
#заметки_по_Rcli позволяет вам создавать интерфейс командной строки. Например, все сообщения, которые вы получаете при использовании tidyverse разработаны именно с помощью cli.
В плане разработки интерфейса командной строки пакет cli предоставляет очень широкий функционал, который невозможно поместить в одну маленькую заметку. Поэтому сегодня мы рассмотрим лишь одну из его возможностей - добавление прогресс бара в циклы.
Добавление прогресс бара осуществляется в 3 шага:
1. Функция cli_progress_bar() создаёт прогресс бар
2. cli_progress_update() обновляет состояние прогресс бара
3. cli_progress_done() завершает работу прогресс бара.
Пример:
clean <- function() {
cli_progress_bar("Cleaning data", total = 100)
for (i in 1:100) {
Sys.sleep(5/100)
cli_progress_update()
}
cli_progress_done()
}
clean()
Результат работы приведённого кода вы видите на изображении к посту.
#заметки_по_Reval - следует ли выполнять код чанка
● echo - следует ли включать исходный код чанка
● results - позволяет отображать выводом результата чанка, возможные значения: markup, asis, hold, hide
● warning - следует ли включать предупреждения в вывод чанка
● error - следует ли включать ошибки в вывод чанка
Все доступные опции чанков можно посмотреть тут.
Обычно опция чанка описываются в фигурных скобках, в шапке чанка:
```{r cars-plot, echo = FALSE, message = FALSE, fig.width = 6, fig.height = 6, fig.path = "figures/", fig.cap = "This is a long caption that fits better inside of a code chunk.", fig.alt = "This is a long description that conveys the meaning of the visual."}
ggplot(data = mtcars, aes(x = wt, y = mpg)) +
geom_point()
```
Если чанк имеет всего пару опций, то такой вариант вполне удовлетворим, но, как в примере выше, если у чанка с десяток опций, то читать их в таком виде достаточно сложно. Начиная с Knitr версии 1.35, опции чанков можно прописывать не только в шапке, но и внутри самого чанка, обозначив их специальным комментарием #|:
```{r cars-plot}
#| echo = FALSE,
#| message = FALSE,
#| fig.width = 6, fig.height = 6,
#| fig.path = "figures/",
#| fig.caption = "This is a long caption that fits better inside of a code chunk"
#| fig.alt = "This is a long description that conveys the meaning of the visual."
ggplot(data = mtcars, aes(x = wt, y = mpg)) +
geom_point()
```
В таком варианте опции чанка читать значительно удобнее.
#заметки_по_Rworrrd позволяет быстро создавать кроссворды на основе дата фреймов. Далее такой кроссворд можно сохранить как изображение или распечатать.
Пример:
library(worrrd)
# Вопросы и ответы
dat <-
dplyr::tribble(
~word, ~clue,
"filter", "фильтрация данных",
"mutate", "добавляет новый столбец",
"arrange", "сортирует данные",
"summarise", "агрегация данных",
"group_by", "группировка данных",
"left_join", "соединить две таблицы"
)
# Создаём объект кроссворда
ex1 <- crossword(words = dat$word, clues = dat$clue, r = 40, c = 40)
# Рисуем кроссворд
plot(ex1, solution = TRUE, clues = TRUE, legend_size = 3)
Аргумент solution = TRUE позволяет скрывать, или наоборот отобрать ответы.
Как по мне, это интересный способ закрепить знания по итогам лекции, или пройденного видео урока. Так что вполне можно использовать в хоте обучения студентов.
Результат работы приведённого кода можно увидеть на изображении к посту.
#заметки_по_Rinfix состоит из коллекции полезных операторов, которые можно разделить на 4 категории:
● Пайп операторы из пакета magrittr, о них я подробно рассказывал тут;
● Оператор обработки ошибок;
● Логические операторы функций;
● Общие операторы.
Операторы обработки ошибок
Для обработки ошибок infix предоставляет вам функцию tryExcept() и оператор %except% . Функция tryExcept() имеет 3 аргумента:
● expr - выражение, которое будет оцениваться
● except - выражение, которое будет выполняться, если expr завершился ошибкой
● error - функция обработчика ошибки, возникшей во время оценки expr.
Примеры:
tryExcept({
foo <- "foo"
stop()
}, except = {
foo <- "foo bar"
})
print(foo) # "foo bar"
С помощью оператора тоже самое можно прописать вот так:
stop()
} %except% {
foo <- "foo bar"
}
print(foo) # "foo bar"
Логические операторы функций
Данный блок состоит из 3 операторов:
f1 %&% f2 - логическое и
f1 %|% f2 - логическое или
f1 %xor% f2 - исключающее или
Пример:
is.null.na <- is.null %|% is.na all(is.null.na(NA), is.null.na(NULL)) # вернёт TRUEОбщие операторы В этот блок входят 4 оператора: ●
%+% - оператор конкатенации строк
● %//% - создаёт строку пути к файлу
● %!in% - логическое не в списке, инвертированный оператор %in%
● %||% - оценивает выражение, и пропускает NULL, аналог функции dplyr::coalesce()
Примеры:
# paste0 (%+%) "01" %+% "jan" %+% "1970" # вернёт "01jan1970" # file.path (%//%) "home" %//% "dir" # вернёт "home/dir" # nomatch (%!in%) 4 %!in% 1:3 # вернёт TRUE # nil (%||%) 1 %||% 2 # вернёт 1 NULL %||% 2 # вернёт 2#заметки_по_R
params
--- title: My Document output: html_document params: year: 2018 region: Europe printcode: TRUE data: file.csv ---К тому же можно использовать динамическое присваивание значений параметрам, указав
!r :
--- title: My Document output: html_document params: date: !r Sys.Date() ---● также для параметризации можно использовать аргумент
params в функции render().
rmarkdown::render("MyDocument.Rmd", params = list(
year = 2017,
region = "Asia",
printcode = FALSE,
file = "file2.csv"
))
Обращение к параметрам
Внутри Rmd файла в случае параметризации вам становится доступен список params, в котором и будут доступны все созданные параметры:
params$year params$region#заметки_по_R