6

I have a list of data frames, and I want to create a character vector that contains the data frame names that meet a certain criteria. In this case, I want the names of the data frames that contain at least 1 observation. I need these names in a vector for use in another function later on.

The list of data frames is created automatically by the split function. For reproducibility, here's a list of data frames:

df1 <- data.frame(replicate(2,sample(0:1,5,rep=TRUE)))
df2 <- data.frame(replicate(2,sample(0:1,5,rep=TRUE)))
df3 <- data.frame(replicate(0,sample(0:1,5,rep=TRUE))) #empty

mylist <- list(df1, df2,df3) #create list of data frames

mylist2 <- mylist[sapply(mylist, function(x) dim(x)[1]) > 0] #subset list so that df's with no observations are dropped

Now, what I need is a character vector with the names of the data frames in mylist2. (In this example, "df1" and "df2".)

Thanks!

agenis
  • 8,069
  • 5
  • 53
  • 102
user3780463
  • 65
  • 1
  • 3

2 Answers2

3

If you want this to be somewhat automatized, for instance you have a large number of data.frames in your environment, you might want to select them with a pattern matching in one line:

mylist = do.call("list", mget(grep("df", ls(), value=T)))
mylist2 <- mylist[sapply(mylist, function(x) dim(x)[1]) > 0]

This creates the first list with all data.frames that have "df" in their names, while keeping their names as attributes of the list elements.

Then I apply your filter for 1-element data.frames and you just retrieve the names:

names(mylist2)
#### [1] "df1" "df2"
agenis
  • 8,069
  • 5
  • 53
  • 102
  • 1
    Your second and third line are equivalent to `names(mylist)[sapply(mylist, nrow) > 0]`. – lmo Jul 06 '17 at 16:10
2

You need to have a named list. Here is how you could do it:

library(dplyr)
library(purrr)

mylist <- list(df1 = df1, df2 = df2, df3 = df3)

test <- mylist %>%
  map_int(nrow)

test[test > 0] %>% names()
#[1] "df1" "df2"
  • Thanks! The issue is that I have over 250 data frames. Is there a simple way to assign each data frame a name without having type out "df1 = df1....df250 = df250"? (I realize this is out of the scope of the original question but a quick search yields no helpful results.) – user3780463 Jul 06 '17 at 16:14
  • 1
    If the list has already been created then you could do: `names(mylist) <- paste0("df", 1L:length(mylist))` – Perry Kuipers Jul 06 '17 at 16:24