【发布时间】:2015-07-16 03:03:20
【问题描述】:
我有一个大气 PM10 数据的大型“NetCDF”文件。您可以从here下载。我正在解释我的问题的详细信息。
这个 ncdf 文件有 8 个像这样的变量。
[1] "file ~/Downloads/2012_03_05_PM10_surface.nc has 8 dimensions:"
[1] "data_num Size: 683016"
[1] "ncl1 Size: 683016"
[1] "obsnum_urban Size: 250"
[1] "ID_LAT_LON Size: 3"
[1] "obsnum_road Size: 33"
[1] "obsnum_background Size: 5"
[1] "obsnum_rural Size: 16"
[1] "ncl7 Size: 683016"
[1] "------------------------"
[1] "file ~/Downloads/2012_03_05_PM10_surface.nc has 8 variables:"
[1] "int TMSID[data_num] Longname:TMSID Missval:NA"
[1] "int TIME[ncl1] Longname:TIME Missval:NA"
[1] "float PM10[data_num] Longname:PM10 Missval:1e+30"
[1] "float urban[ID_LAT_LON,obsnum_urban] Longname:urban Missval:1e+30"
[1] "float road[ID_LAT_LON,obsnum_road] Longname:road Missval:1e+30"
[1] "float background[ID_LAT_LON,obsnum_background] Longname:background Missval:1e+30"
[1] "float rural[ID_LAT_LON,obsnum_rural] Longname:rural Missval:1e+30"
[1] "int TMS_JULIAN[ncl7] Longname:TMS_JULIAN Missval:NA"
在这里,我的兴趣只有 4 个变量。它们是:
TIMSID 是站点的数量(包括城市站点、农村站点、道路、背景等)
urban :: 城市站点数 [urban 是 3 行 250 列矩阵。第1行是城市站点数,第2行是纬度,第3行是经度。]
TIME :: 数据收集时间为 2012 年 3 月 1 日凌晨 1 点至 2012 年 5 月 [“时间”编码为 YYYYMMDDHH]
PM10 :: 在每个站点的每个站点测量的每小时颗粒物浓度
从这个 ncdf 文件中,我已经对 2012 年 3 月 1 日凌晨 1 点(2012030101)的城市站点的 PM10 值进行了子集化。在这里,如您所知,TMSID 是所有站点的 id,但我只想为城市站点(而不是农村、道路等)进行子集化,所以我只匹配了 2012 年 3 月 1 日凌晨 1 点来自 TMSID 的城市 id。这意味着我有仅对城市站点 3 月 1 日的 1 小时 PM10 数据进行了子集化。我使用了以下代码:
library(ncdf)
nc<-open.ncdf("2012_03_05_PM10_surface.nc")
print(nc)
urban<-get.var.ncdf(nc,"urban")
time<-get.var.ncdf(nc,"TIME")
pm10<-get.var.ncdf(nc,"PM10")
tmsid<-get.var.ncdf(nc,"TMSID")
urban<-as.data.frame(t(urban))
colnames(urban)<-c("ID","LAT","LON")
urban311<-lapply(urban$ID,
function(x)data.frame(ID=x,time=2012030101,
PM10=pm10[tmsid%in%x &
time%in%2012030101]))
urban311<-do.call(rbind,urban311)
urban311<-merge(urban311,urban,by="ID")
urban311
urban311<-subset(urban311,select=c("time","ID","LAT","LON","PM10"))
seoul311<-subset(urban311, LAT>=36.8 & LAT <=38 & LON>=126.4 & LON<= 127.3)
rownames(seoul311)<-NULL
在上述代码的最后 2 行中,我根据纬度和经度仅从城市站点的特定区域获得了 PM10 值的子集。最后我得到了一个这样的数据框。
time ID LAT LON PM10
1 2012030101 111121 37.56464 126.9760 42
2 2012030101 111123 37.57203 127.0050 37
.
.
.
106 2012030101 831153 37.49195 126.7533 68
107 2012030101 831154 37.52662 126.8064 57
如您所知,这是一个仅适用于 3 月 1 日凌晨 1 点的数据框。现在我想从 3 月 1 日到 3 月 7 日的每个小时都做同样的工作。这意味着我想获得 (7*24) 数据框。我怎样才能有效地做到这一点?
如果您还有其他问题,请问我。提前致谢。
【问题讨论】:
-
所以您唯一需要做的就是从
urban311行开始,只需将time%in%2012030101更改为time%in%2012030102、time%in%2012030103等?将这些行包装在一个函数中,让它返回数据集,然后使用lapply获取每小时的数据帧列表。那行得通吗? -
@rawr,我是 R 语言的初学者。所以我可能无法理解你的想法。但我可以通过粘贴相同的代码 (7*24) 次来完成这项工作,只需替换 20120302、20120303 等时间。但这变得如此冗长和笨拙。
-
我强烈,强烈推荐使用
raster包。太奇妙了。在这种情况下,它会使事情变得简单得多。它的文档非常好。另外,请考虑使用ncdf4而不是ncdf。