【发布时间】:2014-03-25 12:35:28
【问题描述】:
我正在尝试将 ASCII TOMS 网格格式的文件读入 R。我已经能够以它在 R 中打开的方式读取它。但是,我以线性矩阵的形式打开。该文件包含的内容摘要可在此处获得:
[Link](http://www.temis.nl/docs/README_TOMSASCII.pdf)
数据集的样本可以在这里下载:
[Link](http://www.temis.nl/airpollution/no2col/no2monthscia.php?Year=2005&Month=04)
该数据集是 2006 年 1 月的数据集,我只是将其重命名以方便访问,因为我需要处理的数据很多。我在使用中阅读它:
CCC<-read.csv("no2_200601.asc",header=FALSE,skip=4,sep="\t")
dim(CCC)
[1] 52560 1
如何将其读入 R,以便每个纬度的数据位于一行?我觉得这将有助于建立一个适当的数据结构。
注意:让我尝试一下,简单地说,我理解:
这意味着结构是这样的,一行表示标题,例如lat=-89.9,接下来的 144 行有 20 个元素,每个元素都属于 lat=-89.9 行;所以我现在的问题是在下一个“lat=...”之前将所有这些元素读入一行。
此外,我只是尝试使用以下方法循环一组文件:
NO2files<-list.files(pattern=".asc", full.names=TRUE)
f<-lapply(NO2files, function (x) readLines (x))
for (i in 1:length (NO2files)) {
function(x)
i<-readLines(x)
pattern <- "[[:digit:]]+(?=\\sbins)"
m <- regexpr(pattern, i[3], perl=TRUE)
dim <- regmatches(i[3], m)
m <- regexpr(pattern, i[4], perl=TRUE)
dim[2] <- regmatches(i[4], m)
dim <- as.integer(dim)
pattern <- "(?<=undef=).*"
m <- regexpr(pattern, i[2], perl=TRUE)
na_string <- regmatches(i[2], m)
dat1 <- i[-(1:4)]
sep <- grepl("=", dat1, fixed=TRUE)
dat2a <- dat1[sep]
dat2b <- dat1[!sep]
dat2b <- lapply(dat2b, substring,
first=seq(1,nchar(dat2b[1]),4),
last= seq(4,nchar(dat2b[1]),4))
dat2b <- unlist(dat2b)
dat2b <- as.numeric(dat2b)
dat2b[dat2b==as.numeric(na_string)] <- NA
dat2b <- matrix(dat2b, nrow=dim[2], byrow=TRUE)
dat2b <- dat2b[nrow(dat2b):1, ]
}
【问题讨论】:
-
这似乎不是一个好的文件格式。我想知道为什么人们会想出这样的东西。但是,我不知道任何可以解析这种格式的导入函数(可能有一个包),所以你需要编写自己的解析器。
-
一点都不好,根据我的阅读,这意味着结构是这样的,一行表示标题,例如lat=-89.9,接下来的 144 行有 20 个元素,每个元素都属于 lat=-89.9 行;所以我现在的问题是在下一个“lat = ...”之前将所有这些元素读入一行。
-
本周晚些时候我可能会有一些时间来看看我是否可以使用这些程序之一:disc.sci.gsfc.nasa.gov/ozone/additional/acdisc/additional/…:为您提供一种在 R 中使用之前预处理数据的方法。不确定我现在准备构建一个包:-)