2015-07-02 41 views
0

我是R的初學者,對這個問題非常感興趣。你可以從下面的鏈接下載netCDF文件來看看。如何將我的時空NetCDF數據轉換爲空間數據?

https://drive.google.com/file/d/0ByY3OAw62EShbkF6VWNFUkRYMmM/view?usp=sharing

^這是8變量和8的尺寸我的NetCDF大氣數據文件。在這裏,我感興趣的變量是:

TIMSID是網站數量(包括城市網站,農村網站等)
URBAN ::城市網站數量[城市是3行250列矩陣。第1行是城市網站的數量,第2行是latidude,第3行是經度。]
TIME ::數據收集自2012年3月1日至2012年5月[編碼'時間'爲YYYYMMDDHH]
PM10 ::小時顆粒物濃度在每個站點的每個站點測量

我需要僅使用這些大數據集中的這4個變量。

我只需要在「2012年3月1日」的城市地點分開PM10值的數據。 (實際上,我需要在TIMSID變量中找到哪些網站是城市網站,並且僅針對2012年3月1日的城市網站匹配相應的PM10值。)

例如,在TIMSID中,存在城市,農村等不同類型的網站命名爲111121,111122,111123,111124,但城市網站編號爲111121,111123 ..等等,所以我必須從TIMSID數據中考慮只有城市網站,並且希望匹配相應的pm10值,時間,緯度,經度。然後最後想要創建一個新的數據集。

決賽桌/數據集應該是〜column1-time(2012年3月1日),第2列 - 城市站點數量,第(3,4)列 - 相應城市站點的海拔和經度,第5列每小時pm10值每個城市站點

我已經使用這些命令從NetCDF文件中讀取數據。但我不明白我該怎麼做更多...

install.packages("ncdf",dependencies=TRUE) 
library(ncdf) 

nc<-open.ncdf("2012_03_05_PM10_surface.nc") 
print(nc) 

tmsid<-get.var.ncdf(nc,"TMSID") 
timsid 

urban<-get.var.ncdf(nc,"urban") 
urban 
time<-get.var.ncdf(nc,"TIME") 

pm10<-get.var.ncdf(nc,"PM10") 

因爲我是初學者,所以我只知道基本的命令。我無法弄清楚,我應該學會解決這個問題的具體包。請幫助我?預先感謝您寶貴的時間。如果您需要更多信息,請隨時詢問我。

回答

1
library(ncdf) 
nc <- open.ncdf("2012_03_05_PM10_surface.nc") 
tmsid <- get.var.ncdf(nc,"TMSID") 
urban <- get.var.ncdf(nc,"urban") 
time <- get.var.ncdf(nc,"TIME") 
pm10 <- get.var.ncdf(nc,"PM10") 

首先,讓我們來看看nc

[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" 

它告訴我們那是什麼urban的行是ID,緯度和經度。然後我們有tmsid給出與time矢量相同大小的ID矢量:每個data_num一個,即i。即PM10中的每個數據點有一對ID時間,這意味着我們可以通過ID(其由第一行urban給出)和時間戳(從2012030101至2012030124)來將子集pm10分組。

# First we need to make a dataframe out of urban, for convenience. 
urban <- as.data.frame(t(urban)) 
colnames(urban) <- c("ID", "LAT", "LON") 
# Then we do the subsetting using a lapply, so we can batch-subset: 
res <- lapply(urban$ID, 
       function(x)data.frame(ID=x, 
            pm=pm10[tmsid%in%x & time%in%2012030101:2012030124], 
            time=2012030101:2012030124)) 
# Which gives us a list of sub-dataframes that we want to compress back into a single dataframe: 
res <- do.call(rbind,res) 
# Finally we merge that with the original urban dataframe 
# so that each entry has its own LAT and LON: 
res <- merge(res, urban, by="ID") 
res 
#   ID pm  time  LAT  LON 
#1 111121 42 2012030101 37.56464 126.9760 
#2 111121 36 2012030102 37.56464 126.9760 
#3 111121 46 2012030103 37.56464 126.9760 
#4 111121 40 2012030104 37.56464 126.9760 
#5 111121 36 2012030105 37.56464 126.9760 
#... 
#5995 831154 81 2012030119 37.52662 126.8064 
#5996 831154 72 2012030120 37.52662 126.8064 
#5997 831154 81 2012030121 37.52662 126.8064 
#5998 831154 70 2012030122 37.52662 126.8064 
#5999 831154 74 201203.52662 126.8064 
#6000 831154 74 2012030124 37.52662 126.8064 

250個城市站點X 24小時= 6000個數據點,這確實是我們在這裏得到的。

+0

謝謝@plannapus。感謝R社區爲我啓發了關於R的想法,並且您能否建議我應該對這種類型的數據管理了解更多?最近我正在努力學習申請家庭。有些人會說'plyr'套餐,而不是申請家庭。你怎麼看? – Orpheus

+0

作爲一個純粹的基礎純粹主義者,我認爲你應該首先學會使用'apply'系列,然後,如果你願意的話,'plyr':確實越來越多的人在使用它,所以你至少應該熟悉它來理解他們的代碼,並且我確信有一種方法可以做到我在這個答案中做了什麼,只是用plyr(而不是'lapply','do.call'和merge ',可以直接使用'ddply'我認爲):) – plannapus

+0

非常感謝你@plannapus。我很喜歡這個網頁,並且可能在接下來的幾個月裏,我會不停地用你這個愚蠢的問題打擾你們。提前抱歉。 – Orpheus

相關問題