Using lapply to apply a function over list of data frames and saving output to files with different names

51,402

Solution 1

It will work with the following lapply call:

lapply(names(mylist), function(x) NewVar(mylist[[x]], "y", x))

Solution 2

There are many options. For example:

  lapply(names(mylist),
         function(x)write.csv(mylist[x],
                              file =paste0(x,'.csv')))

or using indexes :

 lapply(seq_along(mylist),
     function(i)write.csv(mylist[i],
                          file =paste0(names(mylist)[i],'.csv')))
Share:
51,402
user2414840
Author by

user2414840

Updated on December 18, 2020

Comments

  • user2414840
    user2414840 over 3 years

    I have a list of data frames and have given each element in the list (e.g. each data frame) a name:

    e.g.

    df1 <- data.frame(x = c(1:5), y = c(11:15))  
    df2 <- data.frame(x = c(1:5), y = c(11:15))  
    mylist <- list(A = df1, B = df2)  
    

    I have a function that I want to apply to each data frame; In this function, I want to include a line to write the results to file (eventually I want to do more complicated things like save plots of the correlation between two variables for each data frame but thought I'd start simple)

    e.g.

    NewVar <- function(mydata, whichVar, i) {  
    mydata$newVar <- mydata[, whichVar] + 1  
    write.csv(mydata, file = i)  
    }
    

    I want to use lapply() to apply this function to each data frame in my list

    something like:

    hh<-lapply(mylist, NewVar, whichVar = "y")
    

    I can't figure out how to assign the "i" within the context of lapply so that i iterates over the names in the list of data frames, saving multiple files with different names (in this case, two files named A and B) that correspond with the modified data frames.