【问题标题】:R: How to setNames to list objects and sub-objectsR:如何设置名称以列出对象和子对象
【发布时间】:2021-10-27 09:45:00
【问题描述】:

考虑这个带有子列表的列表:

my_sub_list <- list()
my_sub_list[[1]] <- lst(mtcars[1:10,])
my_sub_list[[2]] <- lst(mtcars[11:20,])

my_list[[1]] <- my_sub_list
my_list[[2]] <- my_sub_list
my_list[[3]] <- my_sub_list

我想重命名[[1]][[2]][[3]] 组件并使用标签而不是数字。 如何做到这一点?

这对重命名第一级对象不起作用。

setNames(my_list, c('label1', 'label2', 'label3'))

理想情况下,我最终会得到所有对象的标签:

my_list
   [[label1]]
          [[label1.1]]
          [[label1.2]]
   [[label2]]
          [[label2.1]]
          [[label2.2]]
   [[label3]]
          [[label3.1]]
          [[label3.2]]

【问题讨论】:

  • 您从哪个包获得lst?您的示例对我并不适用,因此我怀疑您创建列表的方式以及加载的包存在问题。

标签: r list naming


【解决方案1】:

这样效果更好吗?

my_list = setNames(my_list, c('label1', 'label2', 'label3'))

【讨论】:

    【解决方案2】:

    我仍在考虑如何将标签作为子标签的前缀,但这会让你在此期间继续前进。

    my_list <- setNames(lapply(my_list, setNames, paste0('sub_label', 1:2)), paste0('label', 1:3))
    

    【讨论】:

      【解决方案3】:

      使用库purrr,您可以遍历每个子列表并相应地命名。

      library(purrr)
      
      my_list <- set_names(my_list, c('label1', 'label2', 'label3'))
      imap(my_list, ~ set_names(.x, paste(.y, seq_along(.x), sep = ".")))
      

      如果你想留在基地,你可以改用Map

      my_list <- setNames(my_list, c('label1', 'label2', 'label3'))
      Map(function(.x, .y) setNames(.x, paste(.y, seq_along(.x), sep = ".")), my_list, names(my_list))
      

      数据

      我对您的示例不满意,因此我将代码更改为似乎与您的输出更匹配的代码。也许这也是问题的一部分。

      my_sub_list <- my_list <- list()
      my_sub_list[[1]] <- mtcars[1:10,]
      my_sub_list[[2]] <- mtcars[11:20,]
      
      my_list[[1]] <- my_sub_list
      my_list[[2]] <- my_sub_list
      my_list[[3]] <- my_sub_list
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-08
        • 2019-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多