Добавить дополнительную информацию между добавленными выходными данными 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, ....) 
Другие вопросы по тегам