5

I have sample data like this

df <- data.frame(name = rep(letters[1:7], each = 24), salary = runif(24*7, 100, 200))

I wanted to separate each name with their salaries

lst <- tapply(df$salary, df$name, matrix, nrow = 4, byrow = TRUE)

Now I want to write all these 7 matrices to 7 different text files, It is working only for a single matrix at a time. I tried to put in a for loop but is not working

for (i in 1:7)
{
write.table(lst[i], ".txt", col.names = FALSE, row.names = FALSE, sep = "\t", quote = FALSE)
}

Can any one suggest for the modifications in the for loop?

zx8754
  • 52,746
  • 12
  • 114
  • 209
Matt
  • 475
  • 2
  • 5
  • 7

2 Answers2

15

Given your lst, the following will write this out to a series of TXT files with names equal to the name of lst, plus .txt:

lapply(names(lst),
       function(x, lst) write.table(lst[[x]], paste(x, ".txt", sep = ""),
                                    col.names=FALSE, row.names=FALSE, sep="\t", 
                                    quote=FALSE),
       lst)

To modify your for() loop, try:

for(i in seq_along(lst)) {
    write.table(lst[[i]], paste(names(lst)[i], ".txt", sep = ""), 
                col.names = FALSE, row.names = FALSE, sep = "\t", quote = FALSE)
}

The problem was trying to or assuming R would paste together the filenames for you.

Gavin Simpson
  • 170,508
  • 25
  • 396
  • 453
8

Try this,

for (ii in names(lst)){
  filename <- paste(ii, ".txt", sep="")
  write.table(lst[[ii]], filename, col.names=FALSE,row.names=FALSE,sep="\t",quote=FALSE)
}
baptiste
  • 75,767
  • 19
  • 198
  • 294
  • Thank you! So we have to add another statement in the for loop for saving the filenames...great – Matt Aug 11 '11 at 22:45
  • no, you can directly pass ``write.table(lst[[ii]], paste(ii, ".txt", sep=""), col.names=FALSE,row.names=FALSE,sep="\t",quote=FALSE)`` but I thought it would be clearer in two lines. – baptiste Aug 11 '11 at 23:17