将行组作为矩阵写入R中的多个文件

时间:2018-07-06 01:21:29

标签: r file-io

我是stackoverflow的新手,而R是新手。请指出我做错了或者可以做得更好的任何事情,在这个论坛上提问-谢谢!

我在R中有一个矩阵,其中包含按年份和月份汇总的数据,我想每年写出一个文件,每个文件12行(每个月一行),以及一些其他文本,每个输出文件。

我在这个论坛上研究了几种不同的解决方案:

这些具有我想做的元素,但是tapply似乎仅限于一列(示例中为“ salary”),我想抓取3个来写出来。我也在混合编写数据和自由格式的文本。

我在R中的数据如下:

月|年份沉淀|温度| PanEvap
01 | 2018 | 20 | -4 | 12
02 | 2018 | 15 | 0 | 10
03 | 2018 | 60 | 5 | 40
...等等

(抱歉,缺少格式-不确定如何制作表格,或在最终发布中使用固定宽度的字体!)

我需要这样每年输出一个文件(这将被称为“ 18.dat”,即从年份“ 2018”中获取的“ 18”):

“此处有一些文字”
20 -4 12
15 0 10
60 5 40
... etc
“这里有更多文字”

我希望这是有道理的。任何指导和示例代码将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:0)


尝试一下

# Read data
tmp <- data.table::fread('
Month | Year | Precip | Temp | PanEvap
01 | 2018 | 20 | -4 | 12
02 | 2018 | 15 | 0 | 10
03 | 2018 | 60 | 5 | 40
')


years = unique(tmp$Year)

for (i in years){

    text1 = "Some text up here"
    # remove month and year column
    tmp_df =tmp[which(tmp$Year == i),c(-1,-2)] 
    text2 = "More text down here"
    # use file connection with append mode

    fileConn <- file(paste0("./",i,".dat"),open="w")
    writeLines(text1, fileConn)
    close(fileConn)

    fileConn <- file(paste0("./",i,".dat"),open="a")     
    write.table(tmp_df, fileConn,col.names = FALSE,row.names = FALSE)
    writeLines(text2,fileConn)
    close(fileConn)
}

以及2018年的日期:

    Some text up here
    20 -4 12
    15 0 10
    60 5 40
    More text down here

答案 1 :(得分:0)

在摆弄了我的代码并进一步了解了其他功能之后,我最终想到了这些,我借鉴了我在第一篇文章中链接的文章(我也更改了一年到2017年,以证明多个文件可以创建):

tmp <- data.table::fread('
                         Month | Year | Precip | Temp | PanEvap
                         01 | 2018 | 20 | -4 | 12
                         02 | 2018 | 15 | 0 | 10
                         03 | 2017 | 60 | 5 | 40
                         ')
lst <- split(tmp[,3:5], tmp$Year)
lapply(names(lst),
       function(x, lst) {cat("some text up here",
                             file=paste(x,".dat", sep=""), sep="\n",append=FALSE)
                         write.table(lst[[x]], file=paste(x,".dat", sep=""),
                            col.names=FALSE, row.names=FALSE, sep="\t", 
                            quote=FALSE, append=TRUE)
                         cat("some text down here", "and more I needed, separated by a tab", 
                             file=paste(x,".dat", sep=""), sep="\t", append=TRUE)
                        },
       lst)