Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Write list of data.frames to separate CSV files with lapply

Tags:

r

The question says it all - I want to take a list object full of data.frames and write each data.frame to a separate .csv file where the name of the .csv file corresponds to the name of the list object.

Here's a reproducible example and the code I've written thus far.

df <- data.frame(
    var1 = sample(1:10, 6, replace = TRUE)
    , var2 = sample(LETTERS[1:2], 6, replace = TRUE)
    , theday = c(1,1,2,2,3,3)
)

df.daily <- split(df, df$theday) #Split into separate days

lapply(df.daily, function(x){write.table(x, file = paste(names(x), ".csv", sep = ""), row.names = FALSE, sep = ",")})

And here is the top of the error message that R spits out

Error: Results must have one or more dimensions.
In addition: Warning messages:
1: In if (file == "") file <- stdout() else if (is.character(file)) { :
  the condition has length > 1 and only the first element will be used

What am I missing here?

like image 227
Chase Avatar asked Nov 17 '10 21:11

Chase


3 Answers

Try this:

sapply(names(df.daily), 
 function (x) write.table(df.daily[[x]], file=paste(x, "txt", sep=".") )   )

You should see the names ("1", "2", "3") spit out one by one, but the NULLs are the evidence that the side-effect of writing to disk files was done. (Edit: changed [] to [[]].)

like image 112
IRTFM Avatar answered Nov 04 '22 20:11

IRTFM


You could use mapply:

mapply(
  write.table,
  x=df.daily, file=paste(names(df.daily), "txt", sep="."),
  MoreArgs=list(row.names=FALSE, sep=",")
)

There is thread about similar problem on plyr mailing list.

like image 11
Marek Avatar answered Nov 04 '22 21:11

Marek


A couple of things:

laply performs operations on a list. What you're looking for is d_ply. And you don't have to break it up by day, you can let plyr do that for you. Also, I would not use names(x) as that returns all of the column names of a data.frame.

d_ply(df, .(theday), function(x) write.csv(x, file=paste(x$theday,".csv",sep=""),row.names=F))
like image 7
Brandon Bertelsen Avatar answered Nov 04 '22 21:11

Brandon Bertelsen