2010-11-17 5 views
24

Вопрос гласит все: я хочу взять объект списка, полный data.frames, и записать каждый файл data.frame в отдельный файл .csv, где имя CSV-файл соответствует имени объекта списка.Напишите список data.frames для разделения файлов CSV с помощью lapply

Вот пример воспроизводимости и код, который я написал до сих пор.

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 = ",")}) 

А вот верх сообщение об ошибке, что R выплевывает

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 

Что я здесь отсутствует?

+0

Дубликат http://stackoverflow.com/q/3411429/271616 –

+0

@Joshua - dar, поиск Google не прошел. Я должен идти домой. Не стесняйтесь закрыть это. – Chase

+0

Это не совсем дубликат. Ваша ошибка говорит о том, что вы передаете более одной строки для write.table в качестве имени файла. Имена (x) возвращают все colnames фрейма данных. –

ответ

16

Попробуйте это:

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

Вы должны увидеть имена ("1", "2", "3") выплюнуть один за другим, но Нуль- доказательства того, что сторона -эффект записи в файлы на диске. (Edit: изменен [] на [[]].)

+0

Спасибо за базовое решение R и более краткий способ использования 'paste' , – Chase

+0

Я думаю, что должно быть 'df.daily [[x]]'. – Marek

+0

И df.daily [x], и df.daily [[x]] дают тот же результат на моей машине. Наверное, я вижу логику вашего подозрения. –

5

Пара вещей:

laply выполняет операции по списку. То, что вы ищете, это d_ply. И вам не нужно ломать их день за днем, вы можете позволить plyr сделать это за вас. Кроме того, я бы не использовал имена (x), поскольку возвращает все имена столбцов data.frame.

d_ply(df, .(theday), function(x) write.csv(x, file=paste(x$theday,".csv",sep=""),row.names=F)) 
+0

Я почему-то забыл о функциях «_» plyr. Это сделает трюк. Благодаря! – Chase

+0

Это решение не работает для меня. Я получаю сообщение об ошибке следующим образом: Ошибка в файле (файл, ifelse (append, «a», «w»)): Недопустимый аргумент «описание» Кроме того: Предупреждающее сообщение: In if (file == "") file <- stdout() else if (is.character (file)) {: условие имеет длину> 1, и будет использоваться только первый элемент – zach

Смежные вопросы