【问题标题】:How to generate a named list containing vectors with repeating integers from a named list with character vectors in R?如何从 R 中具有字符向量的命名列表中生成包含具有重复整数的向量的命名列表?
【发布时间】:2021-10-11 04:22:35
【问题描述】:

给出的是下面的列表。此列表包含可变长度的字符向量。

l1 <- list("a" = c("x1", "x2", "x3"),
           "b" = c("x4", "x5"),
           "c" = c("x6", "x7", "x8", "x9"))

> l1
$a
[1] "x1" "x2" "x3"

$b
[1] "x4" "x5"

$c
[1] "x6" "x7" "x8" "x9"

所需的输出,我们称之为l2,如下所示:

$a
[1] 1 1 1

$b
[1] 2 2

$c
[1] 3 3 3 3

此输出具有以下特点:

  • l2 是一个命名列表,其中保留了原始列表 l1 的名称。
  • 列表l2的长度与列表l1相同。
  • l1 中列表元素的顺序保留在 l2 中。
  • l2 包含具有重复整数的向量。 l2中每个向量的长度与l1中对应的字符向量相同。

部分解决方案

我找到了this post,其中下面的语句帮助我构建了部分解决方案。

通常的解决方法是将向量的名称或索引而不是向量本身传递给它。

l2 <- lapply(X = seq_along(l1), 
             FUN = function(x) rep(x, times = length(l1[[x]]))) 
l2
[[1]]
[1] 1 1 1

[[2]]
[1] 2 2

[[3]]
[1] 3 3 3 3

满足所有条件,但名称未保留在 l2 中。

如何一次性解决此问题(不在 lapply 语句后使用单独的语句)?

【问题讨论】:

    标签: r list lapply


    【解决方案1】:

    您可以使用[] 来保留列表中的名称。

    l1[] <- lapply(seq_along(l1), function(x) rep(x, times = length(l1[[x]]))) 
    l1
    
    #$a
    #[1] 1 1 1
    
    #$b
    #[1] 2 2
    
    #$c
    #[1] 3 3 3 3
    

    Map 的另一个解决方案。

    l1[] <- Map(rep, seq_along(l1), lengths(l1))
    

    如果您想让其他对象l2 保持l1 不变,请通过执行l2 &lt;- l1l2 中创建l1 的副本。

    【讨论】:

      【解决方案2】:

      您可以尝试以下基本 R 选项,使用 lengths + rep + relist 如下所示

      > relist(rep(seq_along(l1), lengths(l1)), l1)
      $a
      [1] 1 1 1
      
      $b
      [1] 2 2
      
      $c
      [1] 3 3 3 3
      

      【讨论】:

        【解决方案3】:

        运行上述代码后,只需添加以下代码:-

        names(l2) <- names(l1)
        

        这会将l1 的名称分配给l2,因此您将拥有相同的名称。

        编辑:您无法使用lapply 实现此目的,但您可以使用sapply 通过执行以下操作来实现:-

        l2 <- sapply(X = names(l1), 
                 FUN = function(x) rep(which(names(l1) == x), times = length(l1[[x]])))
        
        l2
        $a
        [1] 1 1 1
        
        $b
        [1] 2 2
        
        $c
        [1] 3 3 3 3
        

        事实证明,如果sapplyX 参数是character 向量,它将使用X 作为返回的list 的名称来返回list

        【讨论】:

        • 感谢肖恩·布拉尔。这将完成这项工作,但我更喜欢使用 lapply 功能一次性完成。任何线索如何实现这一目标?
        • @PeterD,我已经编辑了我的答案。请检查。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-16
        • 2019-03-07
        • 2020-01-24
        • 2021-08-14
        • 2019-02-14
        相关资源
        最近更新 更多