R Расширение каждого уровня списка новыми элементами

#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