我正在学习如何使用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
功能。
答案 0 :(得分:2)
我们可以使用Map
遍历&{39; my_list'的names
。和list
本身,然后使用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))))
或者代替map2
,imap
将list
的名称设为.y
(如@Moody_Mudskipper所评论)
imap(my_list, ~ set_names(.x, paste0(.y, seq_along(.x))))