Как я могу записать несколько файлов с разными именами файлов в R

У меня есть один БОЛЬШОЙ файл (> 10000 строк данных), и я хочу записать отдельный файл по идентификатору. У меня есть 50 уникальных имен идентификаторов, и я хочу, чтобы для каждого из них был отдельный текстовый файл. Вот что у меня есть до сих пор, и я продолжаю получать ошибки. Мой идентификатор на самом деле представляет собой строку символов, которую я бы предпочел, если бы я мог назвать каждый файл после этой строки символов, это было бы лучше.

for (i in 1:car$ID) {
    a <- data.frame(car[,i])
    carib <- car1[,(c("x","y","time","sd"))]
    myfile <- gsub("( )", "", paste("C:/bridge", carib, "_", i, ".txt"))
    write.table(a, file=myfile,
                sep="", row.names=F, col.names=T quote=FALSE, append=FALSE) 
}

person Kerry    schedule 15.04.2011    source источник
comment
Код, который вы написали, очень проблематичен для интерпретации. Трудно сказать, действительно ли ID является колонкой в ​​машине, которую вы хотите использовать. Какой фрейм данных содержит данные... car1? В чем разница между ним и автомобилем? Какой из них вы действительно пытаетесь написать? Он должен быть разбит по столбцам или по строкам? Какие вы действительно хотите, чтобы имена файлов были? Пожалуйста, опишите точнее, что вы хотите сделать.   -  person John    schedule 16.04.2011
comment
Один действительно очевидный вопрос касается вашего оператора myfile. Является ли мост частью желаемого имени файла (помещает файл в корневой каталог) или он должен быть каталогом?   -  person bill_080    schedule 16.04.2011
comment
рассказывая нам, какие сообщения об ошибках, вероятно, тоже помогут.   -  person Ben Bolker    schedule 16.04.2011
comment
возможный дубликат: stackoverflow.com/questions/3411429/   -  person Chase    schedule 16.04.2011
comment
Прошу прощения за некорректно сформулированный вопрос. Я не знал, как представить данные в этом случае или предоставить пример материала, с которым вы могли бы помочь. В столбце ID было 50 уникальных имен. @bill The Bridge был каталогом на диске C, с которым я пытался работать. @ John Car1 и машина - это ошибка. Это должен быть автомобиль для всех. @Chase, спасибо, ссылка помогает, не понял, что это дубликат   -  person Kerry    schedule 18.04.2011


Ответы (2)


Одним из подходов может быть использование пакета plyr и функции d_ply(). d_ply() ожидает data.frame в качестве входных данных. Вы также предоставляете столбец (столбцы), который вы хотите нарезать и нарезать кубиками этого data.frame, чтобы работать с ним независимо друг от друга. В этом случае у вас есть идентификатор столбца. Эта конкретная функция не возвращает объект и поэтому полезна для построения графиков или итеративного создания устава и т. д. Вот небольшой рабочий пример:

library(plyr)

dat <- data.frame(ID = rep(letters[1:3],2) , x = rnorm(6), y = rnorm(6))

d_ply(dat, "ID", function(x)
     write.table(x, file = paste(x$ID[1], "txt", sep = "."), sep = "\t", row.names = FALSE))

Будет сгенерировано три файла, разделенных вкладками, со столбцом идентификатора в качестве имени файла (a.txt, b.txt, c.txt).

ИЗМЕНИТЬ – чтобы ответить на дополнительный вопрос

Вы всегда можете подмножить нужные столбцы, прежде чем передавать их в d_ply(). В качестве альтернативы вы можете использовать/злоупотреблять оператором [ и выбирать нужные столбцы в самом вызове:

dat <- data.frame(ID = rep(letters[1:3],2) , x = rnorm(6), y = rnorm(6)
  , foo = rnorm(6))

d_ply(dat, "ID", function(x)
     write.table(x[, c("x", "foo")], file = paste(x$ID[1], "txt", sep = ".")
     , sep = "\t", row.names = FALSE))
person Chase    schedule 16.04.2011
comment
Это сработало отлично. Как вы думаете, есть ли способ выбрать определенные переменные вместо всех переменных из файла? Это означает, что в этом примере вы указали X и Y, но сказали, что у вас также есть переменная Z, но вы не хотите, чтобы она была в конечном выводе... как бы вы выбрали только X и Y для экспорта из этого фрейма данных? - person Kerry; 18.04.2011
comment
@Kerry - предоставил еще один пример для продолжения вашего вопроса. - person Chase; 18.04.2011
comment
не нужен мой мужчина! то, что вы предоставили, верно. Я просто не мог понять, куда поставить []. Учусь благодаря вам! Большое спасибо, это сработало чудесно. - person Kerry; 19.04.2011

Для фрейма данных с именем mtcars, разделенным mtcars$cyl:

lapply(split(mtcars, mtcars$cyl), 
   function(x)write.table(x, file = paste(x$cyl[1], ".txt", sep = "")))

Это создает «4.txt», «6.txt», «8.txt» с соответствующими данными. Это должно быть быстрее, чем зацикливание/подмножество, поскольку подмножество (разделение) векторизовано.

person Greg    schedule 16.04.2011
comment
Отлично. это тоже сработало. Я ценю все советы, которые вы, ребята, даете! Большое спасибо! - person Kerry; 18.04.2011