Напишите много файлов в цикле for - PullRequest
4 голосов
/ 12 августа 2011

У меня есть пример данных, как это

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

Я хотел отделить каждое имя от зарплаты

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

Теперь я хочу записать все эти 7 матриц в 7 различных текстовых файлов. Он работает только для одной матрицы за раз. Я попытался вставить цикл for, но он не работает

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

Может ли кто-нибудь предложить изменения в цикле for?

Ответы [ 2 ]

15 голосов
/ 12 августа 2011

Учитывая ваш lst, следующий код запишет это в серию файлов TXT с именами, равными имени lst, плюс .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)

Чтобы изменить ваш for() loop, попробуйте:

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)
}

Проблема была в том, чтобы попытаться или предположить, что R вставит вместе имена файлов для вас.

8 голосов
/ 12 августа 2011

Попробуйте,

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...