Создать список data.frames для разделения файлов CSV с помощью lapply - PullRequest
28 голосов
/ 18 ноября 2010

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

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

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

Что мне здесь не хватает?

Ответы [ 3 ]

20 голосов
/ 18 ноября 2010

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

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

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

8 голосов
/ 18 ноября 2010

Вы можете использовать mapply:

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

В теме plyr о рассылке .

есть нить о подобной проблеме.
6 голосов
/ 18 ноября 2010

Пара вещей:

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

d_ply(df, .(theday), function(x) write.csv(x, file=paste(x$theday,".csv",sep=""),row.names=F))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...