将矩阵导出到文本文件时添加特殊 Header 的 R 代码
R Code to Add a Special Header When Exporting a Matrix to a Text File
我有代码从一个大列创建一个 141 x 131 矩阵并将其导出为文本文件。到目前为止效果很好。我将使用 ASCII 转栅格工具将这些文件导入 ArcGIS。 ArcGIS 要导入它们,需要五行 header,header 之后的数据如下所示:
NCOLS 131
NROWS 141
XLLCENTER -150
YLLCENTER -70
CELLSIZE 1
NODATA_VALUE -32768
265 41.7 1.8 12 16 18.3 16.5 18.3 19.7 24.5 26.1 28.4...
一旦 R 保存文本文件,手动粘贴此 header 是微不足道的,但我有 900 多个文件需要处理,所以我想让 R 添加 header当它导出文本文件时。这是可能的还是我可以只添加 header 行作为矩阵的前 5 行然后导出它?
编辑:下面这部分是关于我在评论中提出的另一个问题。
这是我的全部代码:
batch_tpose <- function(filename) {
dat <- matrix(scan(file = filename),ncol=3,byrow=T)
dat_trans <- matrix(dat[,3], 141, byrow=FALSE)
header <- "NCOLS 131
NROWS 141
XLLCENTER -150
YLLCENTER -70
CELLSIZE 1
NODATA_VALUE -32768"
writeLines(header, filename)
write.table(dat_trans, file = filename, row.names=FALSE, col.names=FALSE, append=TRUE)
## This works, I just need the output to be something like out/filename...
}
batch_tpose("200RelVort-nwatl-20201008-15.txt")
我希望能够使用 list.files
在底部的 batch_tpose
命令中处理一堆文件。现在我只是用一个文件进行测试。这有效,但它将文件写入工作目录。它还会覆盖源文件,因为它位于同一目录中。如何将输出文件写入“out”目录?我试过 out/filename
和 file = out/filename
但这会创建一个名为“文件名”的新文件。我尝试了其他组合,但它们导致了错误。
您可以先用 readLines
写入 header,然后用 write.table
(或类似函数)写入数据。诀窍就是选项 append = TRUE
。举个例子:
header <- "NCOLS 131
NROWS 141
XLLCENTER -150
YLLCENTER -70
CELLSIZE 1
NODATA_VALUE -32768"
data <- matrix(rnorm(100), ncol=10)
writeLines(header, "file.txt")
write.table(data, file="file.txt", col.names=FALSE, row.names=FALSE, append=TRUE)
您还可以 paste
将 header 文本与常用的 R 函数一起使用:
ncols=131
nrows=141
header <- paste0("NCOLS ", ncols,
"\nNROWS ", nrows,
"\nXLLCENTER -150
YLLCENTER -70
CELLSIZE 1
NODATA_VALUE -32768")
换行符可以指定为文本字符串中的换行符或使用换行符“\n”代码。
我有代码从一个大列创建一个 141 x 131 矩阵并将其导出为文本文件。到目前为止效果很好。我将使用 ASCII 转栅格工具将这些文件导入 ArcGIS。 ArcGIS 要导入它们,需要五行 header,header 之后的数据如下所示:
NCOLS 131
NROWS 141
XLLCENTER -150
YLLCENTER -70
CELLSIZE 1
NODATA_VALUE -32768
265 41.7 1.8 12 16 18.3 16.5 18.3 19.7 24.5 26.1 28.4...
一旦 R 保存文本文件,手动粘贴此 header 是微不足道的,但我有 900 多个文件需要处理,所以我想让 R 添加 header当它导出文本文件时。这是可能的还是我可以只添加 header 行作为矩阵的前 5 行然后导出它?
编辑:下面这部分是关于我在评论中提出的另一个问题。
这是我的全部代码:
batch_tpose <- function(filename) {
dat <- matrix(scan(file = filename),ncol=3,byrow=T)
dat_trans <- matrix(dat[,3], 141, byrow=FALSE)
header <- "NCOLS 131
NROWS 141
XLLCENTER -150
YLLCENTER -70
CELLSIZE 1
NODATA_VALUE -32768"
writeLines(header, filename)
write.table(dat_trans, file = filename, row.names=FALSE, col.names=FALSE, append=TRUE)
## This works, I just need the output to be something like out/filename...
}
batch_tpose("200RelVort-nwatl-20201008-15.txt")
我希望能够使用 list.files
在底部的 batch_tpose
命令中处理一堆文件。现在我只是用一个文件进行测试。这有效,但它将文件写入工作目录。它还会覆盖源文件,因为它位于同一目录中。如何将输出文件写入“out”目录?我试过 out/filename
和 file = out/filename
但这会创建一个名为“文件名”的新文件。我尝试了其他组合,但它们导致了错误。
您可以先用 readLines
写入 header,然后用 write.table
(或类似函数)写入数据。诀窍就是选项 append = TRUE
。举个例子:
header <- "NCOLS 131
NROWS 141
XLLCENTER -150
YLLCENTER -70
CELLSIZE 1
NODATA_VALUE -32768"
data <- matrix(rnorm(100), ncol=10)
writeLines(header, "file.txt")
write.table(data, file="file.txt", col.names=FALSE, row.names=FALSE, append=TRUE)
您还可以 paste
将 header 文本与常用的 R 函数一起使用:
ncols=131
nrows=141
header <- paste0("NCOLS ", ncols,
"\nNROWS ", nrows,
"\nXLLCENTER -150
YLLCENTER -70
CELLSIZE 1
NODATA_VALUE -32768")
换行符可以指定为文本字符串中的换行符或使用换行符“\n”代码。