在R中附加的write.table输出之间添加附加信息

时间:2014-09-15 04:59:45

标签: r write.table

我正在尝试使用append=TRUE函数的write.table参数将一系列表格输出到CSV文件。但是我想在表格之间添加额外的信息(例如表格标题)。

我是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 个答案:

答案 0 :(得分:0)

简单的解决方案,或多或少是您在问题中包含的代码。

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循环只会稍微发一些。这更容易通用,因为您可以轻松添加或删除新的摘要统计信息。它也不容易出错,但你不是多次复制和粘贴代码。 (这遵循don't repeat yourself的原则。)

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包从您的数据中自动生成报告。

答案 1 :(得分:0)

我不知道这个解决方案是否适用于您的特定示例,但它似乎工作得非常好(除了为某些事件输出一些警告消息):

假设您已将所有表格包装到一个列表中,然后您有一个&#34; for循环&#34;将它们附加到单个csv文件中。然后你可以使用它,在每个编写的csv表中产生一个&#34;空行&#34;:

list_tables 
[[1]]
Table1 
[[2]]
Table2
[[3]]
Table3
[[4]]
Table4

 write.table( rbind(list_tables[[i]], ""), path-filename, append=T, ....)