#r #list #purrr
Вопрос:
Я ищу способ автоматического добавления новых элементов/уровней списка в существующий список:
- в моем случае использования в реальной жизни требуется добавить несколько тысяч элементов, поэтому приведенный ниже пример добавления двух элементов вручную больше не представляется возможным,
- Мне нужен список, потому что это формат, ожидаемый API, к которому я пытаюсь получить доступ.
Пример:
library(tidyverse)
x <- data.frame(id = c(1,2,3),
label = c("label 1", "label 2", "label 3"),
category = c("cat 1", "cat 2", "cat 3"))
x_list <- x %>%
as.list() %>%
transpose()
names <- c("name 1", "name 2")
# Expected final format/output
full_list <- list(list(name = names[1],
info = x_list),
list(name = names[2],
info = x_list))
Поэтому я ищу способ создать этот список списков, в котором я «склеиваю» все значения из names
вектора с помощью «копии» x_list
.
Я не очень хорошо знаком со списками, поэтому немного борюсь. Я знаю, что purrr
пакет может делать потрясающие вещи из списка, поэтому я открыт/с нетерпением жду подхода tidyverse, хотя я также с удовольствием беру базу R. Спасибо.
Комментарии:
1. Настоятельно рекомендуется не создавать переменные, которые имеют тот же символ, что и базовые функции R (т. Е.
names()
).2. правда, это было просто в иллюстративных целях, и я не прилагал слишком много усилий, чтобы помнить обо всех условностях.
3. Просто нужно иметь в виду, что люди, которые хотят вам помочь, будут вводить ваши примерные данные. Если они забудут удалить его после этого, могут возникнуть проблемы.
Ответ №1:
Повторите имена, используя map или используя те же аргументы, замените map на lapply, и в этом случае пакеты не требуются.
library(purrr)
result <- map(names, function(nm) list(name = nm, info = x_list))
identical(result, full_list)
## [1] TRUE