2015-07-02 4 views
0

Я очень новичок в Р., и я полностью поразил эту проблему. вы можете скачать файл netCDF со ссылкой ниже, чтобы посмотреть.Как преобразовать мои пространственно-временные данные NetCDF в пространственные данные?

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

^Это мой NetCDF атмосферная файл данных с 8 переменной и 8 измерения. Здесь представлены мои переменные, представляющие интерес:

TIMSID - это номер сайта (включая городской участок, сельский участок и т. Д.)
URBAN :: количество городских объектов [городской 3-х рядный столбец матрицы. row1 - количество городских объектов, row2 - latidude, строка 3 - долгота.]
TIME :: данные были собраны с 1 марта 2012 по май 2012 г. [кодирование по времени] - YYYYMMDDHH]
PM10 :: концентрация часчатых частиц измеряется на каждой станции каждого участка

Мне нужно работать только с этими 4 переменными из этого большого набора данных.

Мне нужно отделить данные значений PM10 только на городских объектах только за «1 марта 2012 года». (На самом деле мне нужно найти в переменной TIMSID, какие сайты являются городскими сайтами и соответствуют соответствующему значению PM10 для городских объектов только на 01 марта 2012 года.)

Например, в TIMSID существуют различные типы сайтов, таких как городские, сельские и т. Д. названный 111121,111122,111123,111124, но городский номер участка 111121,111123..etc, поэтому я должен рассматривать только городской сайт из данных TIMSID и хочу соответствовать соответствующему значению pm10, времени, широте, долготе. И затем, наконец, хочу сделать новый набор данных.

Конечный стол/набор данных должен быть ~ column1-time (только 1 марта 2012 года), номер столбца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") 

Как я новичок в R, так что я знаю только основные команды. Я не могу понять, какой конкретный пакет я должен научиться решать эту проблему. Пожалуйста, помогите мне? Заранее благодарю за ваше драгоценное время. Если вам нужна дополнительная информация, пожалуйста, спросите меня в любое время.

ответ

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 «s являются ID, широта и долгота. Затем мы имеем tmsid, задавая вектор идентификаторов того же размера, что и вектор time: один на data_num, i. е. одна пара ID-времени на каждый день в PM10, что означает, что мы сможем подмножество pm10 по идентификаторам (которые даются первой строкой urban) и по метке времени (с 2012 по 2012 год - 2012030124).

# 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 часа = 6 000 пунктов данных, что и есть то, что мы получаем здесь.

+0

Спасибо @plannapus. благодаря сообществу R, чтобы вдохновить меня на R., и не могли бы вы предложить мне, что я должен узнать больше об этом типе управления данными? Недавно я пытаюсь научиться применять семью.Некоторые люди говорят о пакете «plyr» вместо того, чтобы применять семью. что вы думаете? – Orpheus

+0

Будучи «пуристом», я бы подумал, что сначала вы должны научиться использовать семейство «apply», а затем, если хотите, «plyr»: это правда, что все больше людей используют его, поэтому вы должны хотя бы познакомиться с ним, чтобы понять их код, и я уверен, что был способ сделать то, что я сделал в этом ответе, только в одном слое с plyr (вместо 'lapply',' do.call', а затем 'merge ', можно было бы использовать прямо' ddply', я думаю) :) – plannapus

+0

Большое спасибо @plannapus. Я получаю поклонника этой веб-страницы, и, вероятно, в течение следующих нескольких месяцев я буду постоянно беспокоить вас, ребята, моим глупым вопросом. извините заранее. – Orpheus

Смежные вопросы