Removing items in a nested R-list by name

I have a nested element like this

> x <- list(a=list(from="me", id="xyz"), b=list(comment=list(list(message="blabla", id="abc"), list(message="humbug", id="jkl"))), id="123") > str(x) List of 3 $ a :List of 2 ..$ from: chr "me" ..$ id : chr "xyz" $ b :List of 1 ..$ comment:List of 2 .. ..$ :List of 2 .. .. ..$ message: chr "blabla" .. .. ..$ id : chr "abc" .. ..$ :List of 2 .. .. ..$ message: chr "humbug" .. .. ..$ id : chr "jkl" $ id: chr "123" 

How to delete all elements with id name at all levels of the list? i.e. expected output

 > str(x) List of 2 $ a:List of 1 ..$ from: chr "me" $ b:List of 1 ..$ comment:List of 2 .. ..$ :List of 1 .. .. ..$ message: chr "blabla" .. ..$ :List of 1 .. .. ..$ message: chr "humbug" 

Solutions using the rlist package will be especially welcome, but I am pleased that it works.

+7
list r
source share
2 answers

Recursion is also how I did it:

 # recursive function to remove name from all levels of list stripname <- function(x, name) { thisdepth <- depth(x) if (thisdepth == 0) { return(x) } else if (length(nameIndex <- which(names(x) == name))) { x <- x[-nameIndex] } return(lapply(x, stripname, name)) } # function to find depth of a list element # see http://stackoverflow.com/questions/13432863/determine-level-of-nesting-in-r depth <- function(this, thisdepth=0){ if (!is.list(this)) { return(thisdepth) } else{ return(max(unlist(lapply(this,depth,thisdepth=thisdepth+1)))) } } str(stripname(x, "id")) ## List of 2 ## $ a:List of 1 ## ..$ from: chr "me" ## $ b:List of 1 ## ..$ comment:List of 2 ## .. ..$ :List of 1 ## .. ..$ :List of 1 ## .. .. ..$ message: chr "blabla" ## .. .. ..$ message: chr "humbug" 
+3
source share

Try recursive function in veins

 f <- function(i) lapply(i, function(x) if (is.list(x)) { if(!is.null(names(x))) f(x[names(x)!="id"]) else f(x) } else x ) str(f(x[names(x)!="id"])) # List of 2 # $ a:List of 1 # ..$ from: chr "me" # $ b:List of 1 # ..$ comment:List of 2 # .. ..$ :List of 1 # .. .. ..$ message: chr "blabla" # .. ..$ :List of 1 # .. .. ..$ message: chr "humbug" 
+2
source share

All Articles