【问题标题】:How to turn a named vector into a named list, while grouping entries with the same name into one list element?如何将命名向量转换为命名列表,同时将具有相同名称的条目分组为一个列表元素?
【发布时间】:2017-03-16 05:28:28
【问题描述】:

我如何从tmp_v 生成tmp_l,如下所示:

tmp_v <- c(a = 1, a = 2, a = 3, b = 2, c = 0, c = 4, a = 4)
tmp_l  <- list(a = c(1, 2, 3, 4), b = 2, c = c(0, 4))

as.list 实现了一半的转换,除了每个向量元素是一个单独的列表元素。我希望将所有具有相同名称的元素合并为一个列表元素:

> as.list(tmp_v)
$a
[1] 1

$a
[1] 2

$a
[1] 3

$b
[1] 2

$c
[1] 0

$c
[1] 4

$a
[1] 4

有趣的是unlist(tmp_l) 几乎提供了反作用:

> unlist(tmp_l)
a1 a2 a3 a4  b c1 c2 
 1  2  3  4  2  0  4 

上下文:像 optim 这样的优化例程需要将参数列表组合成一个参数向量。包执行此转换并将列表中的参数名称添加到参数向量中。找到最优参数向量后,有时需要将其转换回原始列表结构。

【问题讨论】:

    标签: r list vector data-structures


    【解决方案1】:

    我们可以通过vectornamesvector split 来做到这一点

    tmp_n <- split(unname(tmp_v), names(tmp_v))
    identical(tmp_n, tmp_l)
    #[1] TRUE
    

    【讨论】:

      【解决方案2】:

      另一个选项是stackunstack 向量:

      unstack(stack(tmp_v))
      ## $a
      ## [1] 1 2 3 4
      ## 
      ## $b
      ## [1] 2
      ## 
      ## $c
      ## [1] 0 4
      ## 
      
      identical(unstack(stack(tmp_v)), tmp_l)
      ## [1] TRUE
      

      【讨论】:

        【解决方案3】:

        sapply 的另一个选项是为每个 unique 名称查找向量的子集。

        sapply(unique(names(tmp_v)), function(x) unname(tmp_v[names(tmp_v) == x]))
        
        #$a
        #[1] 1 2 3 4
        #
        #$b
        #[1] 2
        #
        #$c
        #[1] 0 4
        

        【讨论】:

          猜你喜欢
          • 2018-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多