1

我正在尝试使用函数的append=TRUE参数将一系列表输出到 CSV 文件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 文件时能够做这样的事情。

4

2 回答 2

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循环。这更容易概括,因为您可以轻松添加或删除新的汇总统计信息。它也不太容易出错,但您不会多次复制和粘贴代码。(这遵循不重复的原则。)

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

于 2014-09-15T05:36:25.827 回答
0

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

假设您已将所有表包装到一个列表中,然后您有一个“for 循环”将它们附加到单个 csv 文件中。然后你可以使用它,在每个写入的 csv 表中生成一个“空行”:

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

 write.table( rbind(list_tables[[i]], ""), path-filename, append=T, ....) 
于 2017-07-19T12:19:22.097 回答