【问题标题】:Name all combinations of two uneven lists命名两个不均匀列表的所有组合
【发布时间】:2016-10-18 07:03:55
【问题描述】:

如何将两个不均匀列表 映射名称的所有组合创建到结果上?我使用了 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"

【问题讨论】:

    标签: r nested-lists purrr


    【解决方案1】:

    事后您总是可以使用setNames(或set_names)。

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

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

    然后您需要命名更高级别的列表,这可以通过从列表的原始名称 ab 创建您想要的名称来完成。我使用了interaction 中的levels 来创建名称。根据您的实际情况,这可能无法很好地扩展。

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

    【讨论】:

      【解决方案2】:

      这个嵌套的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"
      
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-25
        • 1970-01-01
        • 1970-01-01
        • 2020-02-04
        相关资源
        最近更新 更多