Напишите список файлов данных для разделения файлов CSV с использованием
В этом вопросе говорится все: я хочу взять объект списка, полный 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
Что мне здесь не хватает?
Ответы
Ответ 1
Попробуйте следующее:
sapply(names(df.daily),
function (x) write.table(df.daily[[x]], file=paste(x, "txt", sep=".") ) )
Вы должны видеть, что имена ( "1", "2", "3" ) выходят один за другим, но NULL являются доказательством того, что побочный эффект записи на файлы диска был выполнен. (Изменить: сменил [] на [[]].)
Ответ 2
Вы можете использовать mapply
:
mapply(
write.table,
x=df.daily, file=paste(names(df.daily), "txt", sep="."),
MoreArgs=list(row.names=FALSE, sep=",")
)
Существует поток подобной проблемы в списке рассылки plyr
.
Ответ 3
Несколько вещей:
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))