Отображение различных аргументов в список фреймов данных

superball10000 спросил: 28 марта 2018 в 02:53 в: r

Это может быть задание для Purr или, возможно, мне просто нужно изменить макет моей функции или моих данных здесь.

У меня есть функция, которая принимает 2 аргумента, которые я пытаюсь применяются в списке фреймов данных. Одним из аргументов должно быть имя элемента списка (имя), тогда как другое будет компонентом списка (значение в списке).

Список книг - название книги и главы

my_list <- list(Book1 = c("ABC", "DEF", "GHI"), Book2 = c("ABB", "BCC"), Book3 = c("AAA", "BBB", "CCC", "DDD")) 

Функция с аргументом для компонента списка и значения

my_function <- function(Book, Chapter) {path <-  paste("www.fake-website.com", "ctp:", Book, "/", Chapter, sep = "")  ##Would have API call here, but let's just print path
  path     
}

Я могу легко вызвать это в отдельном элементе, указав аргументы в карте

map(my_list$Book1, function(Chapter) my_function(Chapter =   
Chapter, Book = "Book1"))

Выход:

[[1]]
[1] "www.fake-website.comctp:Book1/ABC"[[2]]
[1] "www.fake-website.comctp:Book1/DEF"[[3]]
[1] "www.fake-website.comctp:Book1/GHI"

Но как я могу применить функцию к каждому элементу списка, вызывая функцию для каждого имени книги и значений главы?

Я надеюсь на что-то вроде

[[1]]
[1] "www.fake-website.comctp:Book1/ABC"[[2]]
[1] "www.fake-website.comctp:Book1/DEF"[[3]]
[1] "www.fake-website.comctp:Book1/GHI"[[4]]
[1] "www.fake-website.comctp:Book2/ABB"[[5]]
[1] "www.fake-website.comctp:Book2/BCC"[[6]]
[1] "www.fake-website.comctp:Book2/AAA"[[7]]    
[1] "www.fake-website.comctp:Book2/BBB"[[8]]    
[1] "www.fake-website.comctp:Book2/CCC"[[9]]    
[1] "www.fake-website.comctp:Book2/DDD"

Моя функция на самом деле не просто вставляет книги и главы, а получает кучу информации из API и разбора это.

Однако мне нужна помощь в сопоставлении со списком кадров данных и сопряжении книги arg с главой arg.

1 ответ

Есть решение
Psidom ответил: 28 марта 2018 в 03:22

Вы можете использовать purrr::imap, который передает имена списка в качестве второго аргумента функции:

library(purrr)
imap(my_list, ~ my_function(..2, ..1))
# or imap(my_list, ~ my_function(.y, .x))$Book1
[1] "www.fake-website.comctp:Book1/ABC" "www.fake-website.comctp:Book1/DEF"
[3] "www.fake-website.comctp:Book1/GHI"$Book2
[1] "www.fake-website.comctp:Book2/ABB" "www.fake-website.comctp:Book2/BCC"$Book3
[1] "www.fake-website.comctp:Book3/AAA" "www.fake-website.comctp:Book3/BBB"
[3] "www.fake-website.comctp:Book3/CCC" "www.fake-website.comctp:Book3/DDD"

И если вы переключаете аргументы вашего Функции Book и Chapter вы можете просто сделать:

my_function <- function(Chapter, Book) {
    path <-  paste("www.fake-website.com", "ctp:", Book, "/", Chapter, sep = "")
    path     
}imap(my_list, my_function)$Book1
[1] "www.fake-website.comctp:Book1/ABC" "www.fake-website.comctp:Book1/DEF"
[3] "www.fake-website.comctp:Book1/GHI"$Book2
[1] "www.fake-website.comctp:Book2/ABB" "www.fake-website.comctp:Book2/BCC"$Book3
[1] "www.fake-website.comctp:Book3/AAA" "www.fake-website.comctp:Book3/BBB"
[3] "www.fake-website.comctp:Book3/CCC" "www.fake-website.comctp:Book3/DDD"
superball10000 ответил: 28 марта 2018 в 03:15
В какой упаковке находится"imap"? "imap" и "imap" не дают никаких результатов для меня.
Psidom ответил: 28 марта 2018 в 03:22
Он находится в пакете purrr, который также включен в пакет tidyverse. Так что, если вы уже загрузили tidyverse, он также должен работать.
superball10000 ответил: 28 марта 2018 в 03:50
Мой пакет purrr не показывал функцию, поэтому я обновил ее, и она работает. Спасибо! Я был близок к ответу, но сам не мог его получить. Мурлыканье классное
Psidom ответил: 28 марта 2018 в 03:51
Пожалуйста. Рад, что это работает для вас: -