Получение карты из purrr для работы с paste0

У меня есть 9 списков с группировкой объектов $ ag под ними. Я пытаюсь извлечь этот объект из каждого из 9 списков и превратить их в столбцы в tibble / df. В первом столбце должны быть группы 1: 5. Последующие 9 столбцов представляют собой простой вектор с 5 числами. Извините, это не полная и воспроизводимая информация.

map(hof2009_ag$groupings, "ag") %>% unlist правильно даст мне вектор

[1] 789 615 525 425 352

но это не сработает, если я динамически использую карту с paste0:
map(paste0("hof", i,"_ag$groupings"), "ag").

Итак, я пытаюсь получить 9 списков под названием hof2009: hof2017, сопоставленные через цикл for, используя итератор для доступа к каждому. Когда я пытаюсь использовать paste0 для динамического создания группировок hof (i) _ag $, он больше не работает с картой.

ag <- tibble(group=1:5)
for (i in 2009:2017) {
temp <- paste0("hof", i,"_ag$groupings") #works, "hof2009_ag$groupings"
TEST <- temp %>% map("ag") %>% unlist #fails, produces NULL
TEST <- hof2009_ag$groupings %>% map("ag") %>% unlist #works, produces 789 615 525 425 352
#ag <- map(temp, "ag") %>% unlist #doesn't work on "temp"
}

Вторая проблема - как заставить их добавлять как столбцы. Я играл с add_column, mutate и ag [, i-2008], но не могу заставить его работать, пока карта не работает с вставкой.

Если я использую:

mget(paste0("hof", 2009:2009, "_ag")) %>%
map("groupings") %>% str 

Я получил:

List of 1
 $ hof2009_ag:List of 5
 ..$ :List of 6
 .. ..$ prefs   :'data.frame':  14 obs. of  1 variable:
.. .. ..$ rank: int [1:14] 0 3 3 4 1 0 1 2 1 0 ...
.. ..$ ag      : int 789
.. ..$ grp     : int [1:60] 1 1 1 1 1 1 1 1 1 1 ...
.. ..$ iters   : num 1
.. ..$ run_time: Named num 1.13
.. .. ..- attr(*, "names")= chr "elapsed"
..$ :List of 6
.. ..$ prefs   :'data.frame':   14 obs. of  2 variables:
.. .. ..$ rank  : int [1:14] 0 3 4 5 2 1 2 3 1 1 ...
.. .. ..$ rank.1: int [1:14] 2 4 4 5 1 0 3 3 2 1 ...
.. ..$ ag      : int 615
.. ..$ grp     : int [1:60] 1 1 1 1 1 1 1 1 1 1 ...
.. ..$ iters   : num 4
.. ..$ run_time: Named num 5.61
.. .. ..- attr(*, "names")= chr "elapsed"

Изменить: пример с использованием dput

> dput(hof2009_ag)

list (Decision_makers = c («Фил.Арвия», «Стив.Ашбёрнер», «Филип Бонди», «Боб. Верди»), alternatives = c («Гарольд Бейнс», «Берт.Блайлевен», «Алан. Trammell " ), number_decision_makers = 60L, num_alts = 14L, groupings = list (list (prefs = structure (list (rank = c (0L, 3L, 3L, 4L, 1L, 0L, 1L)), class = "data.frame", row.names = c ("Harold.Baines", "Bert.Blyleven", "Alan.Trammell")), ag = 789L, grp = c (1L, 1L, 1L), iters = 1, run_time = c (истекло = 1.12999999999738), grp2 = structure (list (Decision_Maker = c ("Phil.Arvia", "Steve.Aschburner", "Filip.Bondy", "Dave.Van.Dyck", "Bob.Verdi"), Group_Number = c («1», «1», «1», «1», «1»)), row.names = c (NA, -60L), class = c («tbl_df», «tbl», «data. frame "))), list (prefs = structure (list (rank = c (0L, 3L, 2L), rank.1 = c (2L, 4L, 2L))», class = "data.frame", row.names = c («Гарольд Бейнс», «Берт Блайлевен», «Андре Доусон», «Алан.Траммелл»), ag = 615L, grp = c (1L, 1L, 1L), iters = 4, run_time = c (elapsed = 5.61000000000058), grp2 = structure (list (Decision_Maker = c ("Phil.Arvia", "Steve.Aschburner", "Steve.Wilmoth", "Dave.Van.Dyck", "Bob.Verdi"), Group_Number = c («1», «1», «1», «1»)), row.names = c (NA, -60L), class = c ("tbl_df", "tbl", "data.frame"))), list (prefs = structure (list (rank = c (0L, 3L, 1L, 1L), rank.1 = c (0L, 4L, 2L), ранг 2 = c (1L, 2L, 2L))

Лучше использовать [[ вместо $. также, если эти объекты находятся в глобальном окружении, используйте mget, то есть mget(paste0("hof", 2009:2017, "_ag")) %>% map(~ .x %>% select(groupings)) %>% unlist Не понятно без небольшого воспроизводимого примера, хотя

akrun 10.08.2018 16:23

Краткое пояснение: мой объект находится под hof_2009: 2017 $ groupings $ ag. Так должна ли карта выбирать группы, а затем аг? Я думаю, что небольшая настройка вашего кода может это сделать ...

D Schiff 10.08.2018 16:31
2
2
461
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Был бы полезен воспроизводимый пример. На основе показанного кода получите объекты в глобальной среде с помощью mget и paste, затем прокрутите элементы list, select - элемент «группировки», list и 'ag' (вложенный list) с помощью $ или [[.

library(tidyverse)
mget(paste0("hof", 2009:2017, "_ag")) %>%
        map(~ map(.x$groupings, ~ .x$ag)) 

Это может помочь .. группировки - это подсписок в hof2009_ag. А ag - это список по группам. Так что и столбцы тоже. Могу ли я тогда удвоить карту? Например: $ hof2017_ag $ groupings [[5]] $ ag [1] 5173

D Schiff 10.08.2018 16:39

Ааааааааааааааааааааааааааа, почти. Я думаю, что сопоставление должно выполняться внутри группировок, потому что нет группировок $ ag, только группировки [[i]] $ ag. Итак, каким-то образом нужно разделить 5 групп перед извлечением ag

D Schiff 10.08.2018 17:36

@DSchiff Можете ли вы проверить вывод mget(paste0("hof", 2009:2017, "_ag")) %>% map(~ .x$groupings %>% map(.x %>% pull('ag')))

akrun 10.08.2018 17:52

Вы держите пари: пока не повезло! Ошибка в UseMethod ("pull"): нет подходящего метода для "pull", примененного к объекту класса "list".

D Schiff 12.08.2018 00:47

@DSchiff, пожалуйста, обновите свой пост небольшим примером использования dput, чтобы я мог его протестировать

akrun 12.08.2018 04:01

Добавил - подскажите, не работает ли. Я только что сделал 2 группы, поэтому должно быть только 2 записи $ groupings $ ag: hof2009_ag $ groupings [[1]] $ ag и hof2009_ag $ groupings [[2]] $ ag

D Schiff 14.08.2018 14:31

@DSchiff Можешь попробовать с отредактированным постом. Это основано на вашем dput

akrun 14.08.2018 15:49

Хороший! Последний вопрос. Мне удалось исключить это как единый вектор с%>% unlist%>% as.vector. Есть ли простой способ поместить эти 5 * 9 записей ag в 9 столбцов тиббла? ag2 <- tibble (num_groups = 1: 5, c (2009: 2017)) где для каждого из 2009: 2017 есть соответствующие 5 записей ag?

D Schiff 14.08.2018 15:59

Другие вопросы по теме