2022-06-20 11:00:02
Упрощенная манипуляция списками в 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
411 viewsAlexey Seleznev, 08:00