将不同的args映射到数据帧列表

时间:2018-04-21 16:33:03

标签: r tidyverse

这可能是Purr的工作,或者我只需要在这里更改我的功能或数据的布局。

我有一个函数,它接受2个参数,我试图在数据框列表中应用。其中一个参数应该是列表元素(名称)名称,而另一个参数应该是列表组件(列表中的值)。

图书清单 - 书名和章节

TruckDto

arg用于列表组件和值的函数

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"))

但是如何将函数应用于每个列表元素,将函数调用到每个Book名称和章节值?

我希望像

这样的东西
[[1]]
[1] "www.fake-website.comctp:Book1/ABC"

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

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

我的功能实际上不仅仅是粘贴书籍和章节,而是从API中获取大量信息并对其进行解析。

但是,我需要帮助的是在数据框列表中进行映射并将书籍arg与章节arg配对。

1 个答案:

答案 0 :(得分:2)

您可以使用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"

如果您切换函数的参数BookChapter,则可以执行以下操作:

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"
相关问题