如何在结果中创建两个不均匀列表和地图名称的所有组合?我已经使用了purrr包的cross2
function来生成组合,但我无法通过组合原始列表中的名称来找出一种优雅的方法来命名结果列表。
a <- list(
"alpha" = c(1, 2, 3),
"beta" = c(4, 5, 6),
"gamma" = c(7, 8, 9)
)
b <- list(
"charlie" = c("a", "b"),
"foxtrot" = c("x", "y")
)
library(purrr)
cross2(a, b)
#> [[1]]
#> [[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"
我想保留相同的列表结构,但是将名称映射到列表的两个级别,如下所示:
list(
"alpha.charlie" = list(
"a" = c(1, 2, 3),
"b" = c("a", "b")),
"alpha.foxtrot" = list(
"a" = c(1, 2, 3),
"b" = c("x", "y"))
# ETC
)
#> $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"
答案 0 :(得分:3)
您可以在事后使用setNames
(或set_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
创建所需的名称来完成。我拿了levels
名称的interaction
来创建名称。根据您的实际情况,这可能无法很好地扩展。
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"
...
答案 1 :(得分:1)
这个嵌套的lapply
在更高级别获取名称:
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"
...
您可以使用第二个lapply
添加第二级名称:
myList <- lapply(myList, function(i) {names(i) <- c("a", "b"); i})
myList
$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"
...