I've got dozens of lists, each is a collection of 11 data frames. Some data frames are empty (another script did not output any data, not a bug).
I need to push each list through a function but that chokes when it sees an empty data frame. So how do I write a function that will take a list, do a dim on each element (i.e. data frame) and if it's 0, then skip to the next.
I tried something like this:
empties <- function (mlist) { for(i in 1:length(mlist)) { if(dim(mlist[[i]])[1]!=0) return (mlist[[i]]) } }
But clearly, that didn't work. I would do this manually at this point but that would take forever. Help?
Short answer: You can remove all empty lists from a list of lists by using the list comprehension statement [x for x in list if x] to filter the list.
Creating a list of Dataframes. To create a list of Dataframes we use the list() function in R and then pass each of the data frame you have created as arguments to the function.
I'm not sure if this is exactly what you're asking for, but if you want to trim mlist
down to contain only non-empty data frames before running the function on it, try mlist[sapply(mlist, function(x) dim(x)[1]) > 0]
.
E.g.:
R> M1 <- data.frame(matrix(1:4, nrow = 2, ncol = 2)) R> M2 <- data.frame(matrix(nrow = 0, ncol = 0)) R> M3 <- data.frame(matrix(9:12, nrow = 2, ncol = 2)) R> mlist <- list(M1, M2, M3) R> mlist[sapply(mlist, function(x) dim(x)[1]) > 0] [[1]] X1 X2 1 1 3 2 2 4 [[2]] X1 X2 1 9 11 2 10 12
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With