【发布时间】:2021-08-05 02:12:01
【问题描述】:
我有两个列表foo 和bar,其中length(foo) > length(bar)。我想将函数length(bar) 应用于bar 的每个元素,并将每个应用程序的输出存储在自己的列表中,并将该函数的所有应用程序存储到bar 的每个元素在他们自己的列表中。这个嵌套列表输出结构很重要,因为我将它传递给需要嵌套列表的函数。我所拥有和想要的例子都在最小的例子中。
虽然这适用于嵌套的 for 循环,但我一直在尝试使用 purrr 的 map 函数来实现这一点。我设法通过创建 (a) length(bar) 列表,其中每个元素是 foo,(b) 将这个新列表和 bar 传递给 purrr::pmap() 中的匿名函数,然后 (c ) 将其传递给 purrr:map() 中的匿名函数。
虽然这行得通,但它似乎与purrr 的目的大相径庭:
- 我定义的是匿名函数,而不是
.x、.y和~语法。 - 我没有传递我的原始列表(长度不同),而是将一个列表转换为嵌套列表以匹配另一个列表的长度。这可能会占用大量内存、速度慢等。
- 我正在使用嵌套列表而不是更扁平的列表/数据框,然后我将其划分为我想要的数据结构。
在purrr 中是否有另一种处理不同长度列表的方法而不是我的方法?我如何修改我的代码(下面的最小示例)以更好地利用purrr 的语法?一个想法(Handling vectors of different lengths in purrr)是使用cross() 或其他等效方法来生成单个对象以传递给pmap(),但我不知道如何生成嵌套列表结构。
library(purrr)
# Example data: 2 different-length lists
foo <- list(1, 2, 3)
bar <- list("df1", "df2")
# Desired output:
out <- list(list("df1_1", "df1_2", "df1_3"),
list("df2_1", "df2_2", "df2_3"))
# Distinctive features of output:
#length(out) == length(bar)
#length(out[[1]]) == length(out[[2]])
#length(out[[1]]) == length(foo)
# Can use purrr::pmap but this will concurrently
# iterate through each element of inputs ("in
# parallel") so need to create same-length inputs
foo_list <- rep(list(foo), 2)
# Pass our inputs to pmap then use map to iterate
# over foo contained in each foo_list element.
purrr::pmap(list(foo_list, bar),
function(foo, bar) {
map(foo, function(i) {
paste0(bar, "_", i)
})
})
【问题讨论】:
-
你不能更轻松地取消列出并做到这一点
标签: r list mapping purrr data-wrangling