简体   繁体   English

在R中-当列表具有不同长度时更改列表列表的名称

[英]In R--Change name of list of list of lists when lists have differing lengths

I've tried everything I can...I have a large list of lists.我已经尽我所能......我有一个很大的列表。 They are of varying depths, but they all have a variable name that I need to rename.它们具有不同的深度,但它们都有一个我需要重命名的变量名。 I tried breaking apart the list into data frames, it just seems unpractical and doesn't even do what I want.我尝试将列表分解为数据框,这似乎不切实际,甚至没有做我想做的事。

Here's a toy example:这是一个玩具示例:

list1 = list(changethis = c("1", "2"))
list2 = list(varname1 = c("1,2,3,4"), changethis = c("5,6,7,8"), varname2 = c("9, 10, 11"))
list3 = list(varname3 = list(varname4 = c("first", "second", "third", list(changethis = c("15, 16, 19"), varname5 = "cat", "dog", "fish"))))
list4 = list(varname6 = list(varname7 = list2, varname8 = list2))
list5a = list(varname13 = c("hat", "key"), changethis = c("5"))
list5 = list(varname9 = list(varname10 = list5a, varname11 = list5a)) 
list6 = list(varname12 = list5)
list7 = list(first = list1)

listbig = list(sublist1 = list3, sublist2 = list4, sublist3 = list5, sublist4= list6, sublist5=list7, sublist6 = list5a)

Here's a toy code that produces what I want it to look like.这是一个玩具代码,可以产生我想要的样子。 The 'changethis' var is renamed to 'change' 'changethis' 变量被重命名为 'change'

sollist1 = list(changed= c("1", "2"))
sollist2 = list(varname1 = c("1,2,3,4"), changed = c("5,6,7,8"), varname2 = c("9, 10, 11"))
sollist3 = list(varname3 = list(varname4 = c("first", "second", "third", list(changed = c("15, 16, 19"), varname5 = "cat", "dog", "fish"))))
sollist4 = list(varname6 = list(varname7 = sollist2, varname8 = sollist2))
sollist5a = list(varname13 = c("hat", "key"), changed = c("5"))
sollist5 = list(varname9 = list(varname10 = sollist7, varname11 = sollist5a)) 
sollist6 = list(varname12 = sollist5)
sollist7 = list(first = sollist1)
solution_list = list(sublist1 = sollist3, sublist2 = sollist4, sublist3 = sollist5, sublist4= sollist6, sublist5=sollist7, sublist6=sollist7)

Here is one of my many attempts to do this.这是我这样做的众多尝试之一。 I extracted sublist1 from the big list and tried to just change the name for it, but nothing gets changed.我从大列表中提取了 sublist1 并尝试更改它的名称,但没有任何更改。

extr_sublist1 <- listbig[1]
names(extr_sublist1[[1]][[1]][[1]][4]) <- "changed" #does not do it...

Another failed attempt: In this I extract a differently hierarchial sublist and create a Var name which I hope to loop over so I can change the name of the 'changethis' var.另一个失败的尝试:在这里我提取了一个不同的层次子列表并创建了一个我希望循环的 Var 名称,以便我可以更改“changethis”var 的名称。 Also does not work.也不起作用。

extr_sublist4 <- listbig[4]
numvars <- length(extr_sublist4[[1]][[1]][[1]])

for (i in 1: numvars){
  varname<-paste("Var",numvar, sep = "")
  paste('Var',[i]) <- extr_sublist4[[1]][[1]][[1]][[1]][2]
  namespaste('Var',[i])[paste('Var',[i]) == 'changethis'] <- 'changed'
}

I'm sure there's a simple and elegant solution to this...but have no idea what.我确信有一个简单而优雅的解决方案......但不知道是什么。 Thanks in advance for your help.在此先感谢您的帮助。

You can use a recursive method to do the transformation:您可以使用递归方法进行转换:

changefun <- function(x, change_name, new_name){
  idx <- names(x) == change_name
  if(any(idx)) names(x)[idx] <- new_name
  if (is.list(x)) lapply(x, changefun, change_name, new_name)
  else x
}

Now just call现在只需打电话

changefun(listbig, 'changethis', 'changed')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM