В прошлый раз я изо всех сил пытался сократить количество до десяти, так что вот вам еще десять

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

У меня было ощущение, что R как язык развился до такой степени, что многие из нас сейчас используют его совершенно по-другому. Это означает, что, вероятно, будет множество уловок, пакетов, функций и т. Д., Которые использует каждый из нас, но о которых другие совершенно не подозревают и сочли бы их полезными, если бы знали о них.

Честно говоря, в прошлый раз я изо всех сил старался сократить число до десяти, поэтому вот еще десять вещей о R, которые помогают облегчить мою работу и которые могут быть вам полезны. Напишите здесь или в Твиттере, если что-то из этого полезно для вашей текущей работы, или если у вас есть дополнительные предложения по вопросам, о которых следует знать другим.

1. dbplyr

dbplyr - это именно то, что подразумевает его название. Это позволяет вам использовать dplyr с базами данных. Если вы работаете с базами данных и никогда не слышали о dbplyr, то вы, вероятно, все еще используете строки SQL в своем коде, что заставляет вас думать о SQL, когда вы действительно хотите думать аккуратно, и может быть настоящей болью, когда вы хотите абстрагироваться. ваш код для генерации функций и тому подобное.

dbplyr позволяет создавать запросы SQL с помощью dplyr. Для этого создается таблица базы данных, которой можно управлять с помощью dplyr функций, переводя эти функции в SQL. Например, если у вас есть соединение с базой данных с именем con, и вы хотите управлять таблицей с именем CAT_DATA в CAT_SCHEMA, вы можете настроить эту таблицу как:

cat_table <- dplyr::tbl(
  con,
  dbplyr::in_schema("CAT_SCHEMA", "CAT_TABLE")
)

Затем вы можете выполнять обычные манипуляции, такие как filter, mutate, group_by, summarise и т. Д. На cat_table, и все они будут переведены в SQL-запрос в фоновом режиме. Что невероятно полезно, так это то, что данные физически не загружаются в ваш сеанс R, пока вы не воспользуетесь функцией dplyr::collect(), чтобы окончательно их захватить. Это означает, что вы можете заставить SQL выполнять всю работу и собирать обрабатываемые данные в конце, вместо того, чтобы тянуть всю базу данных в начале.

Чтобы узнать больше о dbplyr, вы можете проверить мою предыдущую статью здесь и учебное пособие здесь.

2. rvest и xml2

Люди говорят, что Python намного лучше подходит для парсинга веб-страниц. Это может быть правдой. Но для тех из нас, кто любит работать в tidyverse, пакеты rvest и xml2 могут значительно упростить простой парсинг веб-страниц, работая с magrittr и позволяя нам передавать команды по конвейеру. Учитывая, что код HTML и XML на веб-страницах обычно сильно вложен, я считаю довольно интуитивно понятным структурировать код очистки с помощью %>%.

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

В качестве быстрого примера я недавно написал функцию для очистки базовой музыкальной диаграммы Billboard в любой момент истории в виде фрейма данных с этой довольно шикарной страницы, используя такой простой код:

get_chart <- function(date = Sys.Date(), positions = c(1:10), type = "hot-100") {     # get url from input and read html  
  input <- paste0("https://www.billboard.com/charts/", type, "/", date)     chart_page <- xml2::read_html(input)       # scrape data  
  chart <- chart_page %>%         
    rvest::html_nodes('body') %>%   
    xml2::xml_find_all("//div[contains(@class, 'chart-list-item  ')]")        rank <- chart %>%     
    xml2::xml_attr('data-rank')      artist <- chart %>%     
    xml2::xml_attr('data-artist')      title <- chart %>%     
    xml2::xml_attr('data-title')     # create dataframe, remove nas and return result  
  chart_df <- data.frame(rank, artist, title)  
  chart_df <- chart_df %>%     
    dplyr::filter(!is.na(rank), rank %in% positions)   chart_df 
}

Подробнее об этом примере здесь, подробнее о rvest здесь и еще о xml2 здесь.

3. k-средства для длинных данных

k-среднее - это все более популярный статистический метод для кластеризации наблюдений в данных, часто для упрощения большого количества точек данных до меньшего числа кластеров или архетипов. Пакет kml теперь позволяет выполнять кластеризацию k-средних для продольных данных, где «точки данных» на самом деле представляют собой ряды данных.

Это очень полезно, когда точки данных, которые вы изучаете, на самом деле являются показаниями с течением времени. Это может быть клиническое наблюдение за прибавкой или потерей веса у пациентов больниц или траекториями компенсации сотрудников.

kml сначала преобразует данные в объект класса ClusterLongData с помощью функции cld. Затем он разбивает данные, используя алгоритм «восхождения на холм», проверяя несколько значений k 20 раз каждое. Наконец, функция choice() позволяет графически просматривать результаты алгоритма для каждого k и решать, что вы считаете оптимальной кластеризацией.

4. Окно подключений в RStudio

Окно подключений в последней версии RStudio позволяет просматривать любые удаленные базы данных без необходимости переходить в отдельную среду, такую ​​как разработчик SQL. Это удобство теперь дает возможность выполнять проекты разработчиков полностью в среде RStudio IDE.

Настроив подключение к удаленной базе данных в окне подключений, вы можете просматривать вложенные схемы, таблицы, типы данных и даже просматривать таблицу напрямую, чтобы увидеть отрывок из того, как выглядят данные.

Окно подключений в последних версиях RStudio

Подробнее об окне подключений здесь.

5. tidyr :: complete ()

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

Обычно эта проблема возникает, когда вы отправляете данные в какую-либо графическую функцию, которая ожидает увидеть нулевые значения при отсутствии наблюдений и не может понять, что отсутствующая строка означает нулевые значения в этой строке. Это также может быть проблемой, когда вы делаете прогнозы на будущее, а в начальной точке отсутствуют строки.

Функция complete() в tidyr позволяет вам заполнить пробелы для всех наблюдений, по которым не было данных. Это позволяет вам определить наблюдения, которые вы хотите завершить, а затем объявить, какое значение использовать для заполнения пробелов. Например, если вы производили подсчет кобелей и сук разных пород и у вас были некоторые комбинации, для которых в выборке не было собак, вы можете использовать следующее, чтобы справиться с этим:

dogdata %>%
  tidyr::complete(SEX, BREED, fill = list(COUNT = 0))

Это расширит ваш фрейм данных, чтобы гарантировать включение всех возможных комбинаций SEX и BREED, и заполнит отсутствующие значения COUNT нулями.

6. gganimate

Анимированная графика сейчас в моде, и пакет gganimate позволяет тем, кто использует ggplot2 (я бы сказал, большинство пользователей R), очень просто расширить свой код для создания анимированной графики.

gganimate работает, используя данные, которые существуют для ряда «переходных состояний», обычно за годы или какой-либо другой вид временных рядов. Вы можете отобразить данные в каждом состоянии перехода, как если бы это была простая статическая ggplot2 диаграмма, а затем использовать функцию ease_aes() для создания анимации, которая перемещается между состояниями перехода. Существует множество вариантов того, как происходит переход, и функция animate() позволяет отображать графику в различных формах, таких как анимированный gif или mpeg.

Вот пример, в котором я генерирую знаменитую пузырьковую диаграмму Ханса Рослинга с помощью единственной конвейерной команды:

Код для этого см. Здесь, а красивое пошаговое руководство по gganimate, которое я нашел действительно полезным, см. Здесь.

7. networkD3

D3 - чрезвычайно мощная библиотека визуализации данных для javascript. Стало доступным все большее количество пакетов, которые позволяют пользователям R создавать визуализацию в D3, например R2D3, что хорошо не в последнюю очередь потому, что позволяет нам восхищаться одной из лучших шестнадцатеричных наклеек на свете (см. Здесь).

Мой любимый пакет D3 для R - networkD3. Он существует уже некоторое время и отлично подходит для построения графиков или сетевых данных в отзывчивом или эстетически приятном виде. В частности, он может строить сети с направленным усилием с использованием forceNetwork(), диаграммы Санки с использованием sankeyNetwork() и хордовые диаграммы с использованием chordNetwork(). Вот пример простой сети санки, которую я создал, показывая потоки голосов по регионам на референдуме Brexit.

Потоки голосования на референдуме Brexit с использованием networkD3

Подробнее об этом конкретном примере здесь и о networkD3 здесь.

8. Таблицы данных в RMarkdown или Shiny с использованием DT.

Пакет DT - это интерфейс от R к библиотеке javascript DataTables. Это позволяет очень легко отображать таблицы в блестящем приложении или документе R Markdown, которые имеют множество встроенных функций и отзывчивость. Это избавляет вас от необходимости кодировать отдельные функции загрузки данных, дает пользователю гибкость в отношении представления и упорядочивания данных и имеет встроенную возможность поиска данных.

Например, простая команда, такая как:

DT::datatable(
  head(iris),
  caption = 'Table 1: This is a simple caption for the table.'
)

Можно произвести что-нибудь столь же красивое, как это:

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

9. Прокачай свой RMarkdown с prettydoc

prettydoc - это пакет от Yixuan Qiu, который предлагает простой набор тем для создания другого, более красивого внешнего вида ваших документов RMarkdown. Это очень полезно, когда вы просто хотите немного оживить свои документы, но у вас нет времени, чтобы самостоятельно их стилизовать.

Это действительно удобно. Простое редактирование заголовка YAML вашего документа может вызвать определенную тему стиля во всем документе с многочисленными доступными темами. Например, это вызовет прекрасный чистый синий цвет и стиль для заголовков, таблиц, встроенного кода и графики:

---
title: "My doc"
author: "Me"
date: June 3, 2019
output:
  prettydoc::html_pretty:
    theme: architect
    highlight: github
---

Подробнее на prettydoc здесь.

10. При желании скройте свой код в RMarkdown с помощью code_folding.

RMarkdown - отличный способ записать вашу работу, позволяя вам написать повествование и записать свой код в одном месте. Но иногда ваш код может быть ошеломляющим и не особенно приятным для некодеров, которые пытаются прочитать только повествование о вашей работе и не интересуются тонкостями того, как вы проводили анализ.

Раньше у нас были только опции: либо установить echo = TRUE, либо echo = FALSE в наших knitr опциях, чтобы либо отображать наш код в документе, либо нет. Но теперь мы можем установить параметр в заголовке YAML, который дает нам лучшее из обоих миров. Установка code_folding: hide в заголовке YAML по умолчанию скроет фрагменты кода, но предоставит небольшие щелкающие мышью поля в документе, чтобы читатель мог просматривать весь код или отдельные фрагменты, когда и когда они захотят, например:

Выпадающие списки сворачивания кода в R Markdown

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

Изначально я был чистым математиком, затем стал психометриком и специалистом по анализу данных. Я увлечен применением всех этих дисциплин к сложным вопросам людей. Я также помешан на кодировании и большой поклонник японских ролевых игр. Найдите меня в LinkedIn или Twitter.