【问题标题】:naming elements inside list using lapply使用 lapply 命名列表中的元素
【发布时间】:2018-06-05 16:15:21
【问题描述】:

我正在学习如何使用lapply 和其他方法访问复杂列表中的列表元素。我需要在某些级别上设置对象名称,但我一开始就卡住了。所以让我们创建列表:

my_list=vector("list",3)#create empty list of 3 elements 
names(my_list)=c("1st.element","2nd.eleent","3rd.element")#set names(this is easy) 
my_list=lapply(my_list, function(x) x=vector("list",5))#each element is list consisting 5 elements

所以现在我想为每个元素设置名称。我知道如何使用for

for(i in 1:length(my_list)){names(my_list[[i]])=paste(names(my_list[i]),1:length(my_list[[i]]),sep=".")}

这个循环的输出是我想要的输出。如何实现?我用lapply 尝试了不同的方法,最接近上面的代码是:

lapply(my_list[[i]],function(i)names(i)=paste(names(my_list[i]),1:length(my_list[[i]]),sep="."))

请记住,我仍在学习 apply 函数。

【问题讨论】:

  • 您的 for 循环正是我所需要的!我一直在整个 stackoverflow 上寻找一种将列表元素前缀添加到我的列的方法!像魅力一样工作

标签: r


【解决方案1】:

我们可以使用Map 循环遍历'my_list' 的nameslist 本身,然后使用setNames 命名各个嵌套的list 元素

Map(function(x, y) setNames(x, paste0(y, seq_along(x)))
            , my_list,  names(my_list))

使用tidyverse 的类似选项是

library(purrr)
map2(my_list, names(my_list), ~ set_names(.x, paste0(.y, seq_along(.x))))

或者代替map2imap 获取list 的名称为.y(正如@Moody_Mudskipper 评论的那样)

imap(my_list, ~ set_names(.x, paste0(.y, seq_along(.x))))

【讨论】:

  • 你可以在.y == names(.x) in map2时使用imap
猜你喜欢
  • 2021-05-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
相关资源
最近更新 更多