Обложка канала

R4marketing | канал Алексея Селезнёва | Язык R

Автор канала Алексей Селезнёв, руководитель отдела аналитики в Netpeak, автор R пакетов: ryandexdirect, rfacebookstat и др. В канале публикуются статьи, доклады, новости, заметки по языку R.

R4marketing | канал Алексея Селезнёва | Язык R

4 года назад
Открыть в
​​Упрощенная манипуляция списками в R с помощью пакета listr Пакет listr вошел в топ 40 опубликованных на CRAN пакетов в апреле 2022 года. Основной целью пакета является упрощение простых операций по манипуляции списками, сделать синтаксис этих операций легко читаемым и дружественным к пайпам. Функции listr: list_append() - Добавить элемент в конец списка ● list_bind() - Объединить элементы списка, и позволяет указать те элементы, которые необходимо извлечь после объединения ● ist_bind_all() - Объединить элементы списка, и извлекает все элементы после объединения ● list_extract() - Извлечение элементов списка ● list_flatten() - Выравнивание вложенных уровней списка ● list_insert() - Добавить элемент в список, на указанную позицию ● list_is_compatible_class() - Проверяет принадлежность всех элементов вектора одному классу, данная функция считает совместимые классы (например data.frame, tibble, data.table) за один класс. ● list_is_same_class() - Проверяет принадлежность всех элементов вектора одному классу, данная функция считает совместимые классы (например data.frame, tibble, data.table) как разные классы. ● list_join_df() - Объединить фреймы, которые являются элементами списка по ключу, "сджойнить" ● list_name_to_df() - Добавляет имена элементов в виде дополнительного стобца фрейма, функция используется только со списом состоящим из фреймов. ● list_prepend() - Добавить элемент в начало списка ● list_remove() - Удалить элемент списка ● list_rename() - Переименовать элементы именованного списка ● list_select() - Выбор отдельных частей списка Пример:
 
library(listr)

# тестовые данные
by_cyl <- split(mtcars, mtcars$cyl)

# переименовываем элементы списка
by_cyl <- by_cyl |> 
  list_rename("cyl4" = `4`, "cyl6" = `6`, "cyl8" = `8`)

# выбор элементов списка
by_cyl |> list_select(1, 2)
cyl4 <- by_cyl |> list_extract(cyl4)

# удаляем элемент списка
by_cyl <- by_cyl |> list_remove(cyl4)

# добавляем элемент списка
by_cyl <- by_cyl |> list_prepend(cyl4, name = "cyl4")

# объединяем таблицы в списке
by_cyl |> 
  list_bind(cyl4, cyl6, what = "rows", name = "cyl4_and_6")

# объединяем таблицы по ключу
dfl <- list(
  data.frame(idx = sample(100, 30), x = rnorm(30)),
  data.frame(idx = sample(100, 30), y = rnorm(30)),
  data.frame(idx = sample(100, 30), z = rnorm(30))
  )

list_join_df(dfl, join_type = 'inner', by = 'idx')

# Проверяем принадлежат ли отдельные элементы списка одному классу
dfl <- list(
  tibble::tibble(idx = 21:40, y = rnorm(20)),
  data.frame(idx = 21:40, y = rnorm(20)),
  data.frame(idx = 41:60, y = rnorm(20))
  )

list_is_same_class(dfl)
list_is_compatible_class(dfl)
Для операций со списками есть и более функциональный пакет - `rlist`, но в рамках одного поста в канале рассказать о нём сложно, поэтому о нём я либо запишу видео урок, либо статью. Ссылки: - Большая часть примеров кода взяты из виньетки "An Introduction to listr" #заметки_по_R