R 列出两个不均匀列表的所有组合

R 列出两个不均匀列表的所有组合,r,nested-lists,purrr,R,Nested Lists,Purrr,如何创建两个不均匀列表的所有组合并将名称映射到结果上?我已经使用了purrr包来生成组合,但是我无法通过组合原始列表中的名称来为结果列表命名 a[[1][[1]] #> [1] 1 2 3 #> #> [[1]][[2]] #>[1]“a”“b” #> #> #> [[2]] #> [[2]][[1]] #> [1] 4 5 6 #> #> [[2]][[2]] #>[1]“a”“b” #> #> #> [[3]] #> [[3]][[1]] #> [1] 7 8 9 #> #>

如何创建两个不均匀列表的所有组合并将名称映射到结果上?我已经使用了purrr包来生成组合,但是我无法通过组合原始列表中的名称来为结果列表命名

a[[1][[1]]
#> [1] 1 2 3
#> 
#> [[1]][[2]]
#>[1]“a”“b”
#> 
#> 
#> [[2]]
#> [[2]][[1]]
#> [1] 4 5 6
#> 
#> [[2]][[2]]
#>[1]“a”“b”
#> 
#> 
#> [[3]]
#> [[3]][[1]]
#> [1] 7 8 9
#> 
#> [[3]][[2]]
#>[1]“a”“b”
#> 
#> 
#> [[4]]
#> [[4]][[1]]
#> [1] 1 2 3
#> 
#> [[4]][[2]]
#>[1]“x”“y”
#> 
#> 
#> [[5]]
#> [[5]][[1]]
#> [1] 4 5 6
#> 
#> [[5]][[2]]
#>[1]“x”“y”
#> 
#> 
#> [[6]]
#> [[6]][[1]]
#> [1] 7 8 9
#> 
#> [[6]][[2]]
#>[1]“x”“y”
我希望保持相同的列表结构,但将名称映射到列表的两个级别,如下所示:

列表(
“alpha.charlie”=列表(
“a”=c(1,2,3),
“b”=c(“a”、“b”),
“alpha.foxtrot”=列表(
“a”=c(1,2,3),
“b”=c(“x”,“y”))
#等
)
#>$alpha.charlie
#>$alpha.charlie$a
#> [1] 1 2 3
#> 
#>$alpha.charlie$b
#>[1]“a”“b”
#> 
#> 
#>$alpha.foxtrot
#>$alpha.foxtrot$a
#> [1] 1 2 3
#> 
#>$alpha.foxtrot$b
#>[1]“x”“y”

此嵌套的
lappy
获取更高级别的名称:

myList <- unlist(lapply(a, function(i) lapply(b, function(j) list(i, j))), recursive = F)

myList
$alpha.charlie
$alpha.charlie[[1]]
[1] 1 2 3

$alpha.charlie[[2]]
[1] "a" "b"


$alpha.foxtrot
$alpha.foxtrot[[1]]
[1] 1 2 3

$alpha.foxtrot[[2]]
[1] "x" "y"

...

您可以在事后始终使用
setNames
(或
set\u names

cross2
文档中有一个简单的例子,用
map
setNames
命名每个列表中的元素。在你的情况下,这看起来像

cross2(a, b) %>% 
    map(setNames, c("a", "b"))

[1]]
[[1]]$a
[1] 1 2 3

[[1]]$b
[1] "a" "b"


[[2]]
[[2]]$a
[1] 4 5 6

[[2]]$b
[1] "a" "b"
...
然后需要命名更高级别的列表,这可以通过从列表
a
b
的原始名称创建所需的名称来完成。我采用名称的
交互
级别来创建名称。根据您的实际情况,这可能无法很好地扩展

cross2(a, b) %>% 
    map(setNames, c("a", "b")) %>% 
    setNames(levels(interaction(names(a), names(b))))

$alpha.charlie
$alpha.charlie$a
[1] 1 2 3

$alpha.charlie$b
[1] "a" "b"


$beta.charlie
$beta.charlie$a
[1] 4 5 6

$beta.charlie$b
[1] "a" "b"
...
cross2(a, b) %>% 
    map(setNames, c("a", "b")) %>% 
    setNames(levels(interaction(names(a), names(b))))

$alpha.charlie
$alpha.charlie$a
[1] 1 2 3

$alpha.charlie$b
[1] "a" "b"


$beta.charlie
$beta.charlie$a
[1] 4 5 6

$beta.charlie$b
[1] "a" "b"
...