Добавить дополнительную информацию между добавленными выходными данными write.table в R
Я пытаюсь вывести серию таблиц в файл CSV, используя append=TRUE
аргумент write.table
функция. Однако я хотел бы добавить дополнительную информацию между таблицами (например, подписи к таблицам).
Я очень плохо знаком с R и не знаю, как использовать циклы / определять функции и т. Д., Поэтому делайте все построчно, поэтому буду признателен за решения, которые будут в таком же простом формате, чтобы я мог манипулировать кодом для другие использования позже.
Мой текущий код:
table1 <- aggregate(myData[,7:11],by=list(myData$Variable1), min)
table2 <- aggregate(myData[,7:11],by=list(myData$Variable1), median)
table3 <- aggregate(myData[,7:11],by=list(myData$Variable1), max)
write.table(table1, file="myDataTables.csv", append = FALSE, sep=",", row.names=FALSE)
write.table(table2, file="myDataTables.csv", append = TRUE, sep=",", row.names=FALSE)
write.table(table3, file="myDataTables.csv", append = TRUE, sep=",", row.names=FALSE)
Мой CSV-файл выходит так:
table 1 column names
table 1 data (10 rows)
table 2 column names
table 2 data (10 rows)
table 3 column names
table 3 data (10 rows)
Как бы я хотел, чтобы это выглядело (включая пустые строки):
Table 1 caption (eg. "Table 1: Table name")
table 1 column names
table 1 data (10 rows)
Table 2 caption (eg. "Table 2: Table name")
table 2 column names
table 2 data (10 rows)
Table 3 caption (eg. "Table 3: Table name")
table 3 column names
table 3 data (10 rows)
Когда я отправлял вывод в файлы.txt, я использовал функцию cat для добавления подписей и пустых строк, как показано ниже:
out<-capture.output(table1)
cat("Table 1: Table Name","",out,"","",file="myDataTables.txt",sep="\n",append=TRUE)
Я хотел бы иметь возможность делать что-то подобное при записи файлов CSV.
2 ответа
Простое решение, которое представляет собой код, который вы включили в свой вопрос.
co2_mins <- aggregate(. ~ Plant, CO2, min)
co2_medians <- aggregate(. ~ Plant, CO2, median)
co2_maxs <- aggregate(. ~ Plant, CO2, max)
out_file <- "myDataTables.csv"
sep <- ","
cat("Table 1: CO2 minima by plant\n", file = out_file)
write.table(co2_mins, out_file, append = TRUE, sep = sep)
cat("\nTable 2: CO2 medians by plant\n", file = out_file, append = TRUE)
write.table(co2_mins, out_file, append = TRUE, sep = sep)
cat("\nTable 3: CO2 maxima by plant\n", file = out_file, append = TRUE)
write.table(co2_mins, out_file, append = TRUE, sep = sep)
Только немного любопытнее использовать for
петля. Это легче обобщить, потому что вы можете легко добавлять или удалять новую сводную статистику. Он также менее подвержен ошибкам, но вы не копируете и не вставляете код несколько раз. (Это следует принципу не повторяйся.)
fns <- list(minima = min, medians = median, maxima = max)
for(i in seq_along(fns))
{
summary_stats <- aggregate(. ~ Plant, CO2, fns[[i]])
cat(
if(i > 1) "\n",
"Table ", i, ": CO2 ", names(fns)[i], " by plant\n",
file = out_file,
sep = "",
append = i > 1
)
write.table(
summary_stats,
out_file,
append = TRUE,
sep = ","
)
}
Я, наверное, должен отметить, что то, что вы хотите, немного странно. Файлы CSV отлично подходят для хранения данных, но не для чтения людьми. Наличие в этой ситуации нескольких файлов CSV и подписей для чтения человеком затрудняет использование программного обеспечения, поэтому теперь у вас есть файл, который трудно читать и плохо подходит для хранения данных.
Лучше хранить ваши данные в отдельных файлах CSV, а затем использовать knitr
пакет для автоматического создания отчета из ваших данных.
Я не знаю, работает ли это решение в вашем конкретном примере, но, кажется, оно работает довольно хорошо в моем случае (за исключением вывода некоторых предупреждающих сообщений для некоторых событий):
Допустим, вы завернули все свои таблицы в список, а затем у вас есть "цикл for" для добавления их в один CSV-файл. Затем вы можете использовать это для создания "пустой строки" в каждой записанной таблице csv:
list_tables
[[1]]
Table1
[[2]]
Table2
[[3]]
Table3
[[4]]
Table4
write.table( rbind(list_tables[[i]], ""), path-filename, append=T, ....)