Re: [问题] 月平均资料

楼主: andrew43 (讨厌有好心推文后删文者)   2018-10-23 09:32:35
# 已先自 http://0rz.tw/JI056 下载 trmm_2010.nc
library(ncdf4)
library(data.table)
obs <- nc_open("trmm_2010.nc")
lon <- ncvar_get(obs, "lon") # 经度切1440份
lat <- ncvar_get(obs, "lat") # 纬度切400份
time <- ncvar_get(obs, "time") # 单位为小时,共365个
precip <- ncvar_get(obs, "r") # 第一维为lon,第二维为lat,笫三维为time
time2 <-
as.Date(time / 24, format = "%Y-%m-%d", origin = "2010-01-01")
# 先把单位由小时换算成天
##############
# 以每日求12个月平均
# precip.ave.monthly[1, , ] 到 precip.ave.monthly[12, , ] 表示各月均雨量
# 这步很慢,有需要再改写
precip.ave.monthly <-
apply(precip, c(1, 2), function(x) {
tapply(x, month(time2), mean)
})
image(lon, lat, precip.ave.monthly[6, ,]) # 六月份
# 以每日求全年总平均
precip.ave.overall <- apply(precip, c(1, 2), mean)
image(lon, lat, precip.ave.overall)
par(mfrow = c(3, 4),
mar = c(2, 2, 2, 2),
cex = 8 / 12)
for (i in 1:12) {
image(
lon,
lat,
precip.ave.monthly[i, ,],
col = gray(0:255 / 256),
xlab = "",
ylab = ""
)
title(paste("month:", i))
}
※ 引述《AndrewShi (没有妳的我)》之铭言:
: [问题类型]:
: 程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
: [软件熟悉度]:
: 入门(写过其他程式,只是对语法不熟悉)
: [问题叙述]:
: 各位大大好,
: 我放入的这笔资料是2010年全球每天的降雨(量)资料,现在我想把每日的降雨量计算成月
: 平均.年平均降雨量,下面我所想到的循环是可以画得出图来,但画出来感觉不太正确,所以想请
: 教大大们我的循环是否有问题,能否给我一些提点,谢谢。
: p.s:原本的资料型态中降雨值的维度只包含经度和纬度(2维),所以我用rbind把时间的维
: 度也并到降雨值里。
: [程式范例]:
: rm(list=ls())
: library(ncdf4)
: TRMM_data <- "C:\\Users\\TOM\\Desktop\\R(数据库)\\TRMM资料\\trmm_2010.nc"
: obs <- nc_open(TRMM_data)
: print(obs)
: lon <- ncvar_get(obs, "lon")
: lat <- ncvar_get(obs, "lat")
: time <- ncvar_get(obs, "time")
: precip <- ncvar_get(obs,"r")
: time <- matrix(seq(as.Date("2010-01-01"), as.Date("2010-12-31"),1))
: rbind(dim(time),precip[[3]])
: time <- c()
: for(time in seq_along(1:31)){
: mean(precip)
: }
: time <- c()
: for(time in seq_along(1:365)){
: mean(precip)
: }
: lon <- lon-180
: #lat <- rev(lat)
: precip <- precip[,,time]
: library(RColorBrewer)
: image(lon,lat,precip,col=rev(brewer.pal(10,"RdBu")))
: library(maptools)
: gpclibPermit()
: data(wrld_simpl)
: plot(wrld_simpl,add=TRUE)
: [环境叙述]:
: [关键字]:
: 月平均 nc档 降雨
作者: AndrewShi (没有妳的我)   2018-10-23 11:32:00
非常感谢andrew大,愿意花这么多时间帮我解答,我今天也会好好研究程式码,如果对于你写的程式码有疑惑的话方便能再请教你吗XD??abdrew大~我想请教apply里的c(1,2)是指把每列.每行(每个经度.纬度)的降雨值都带到function里面的意思对吗?!另外想请问你是怎么把时间(月)放到precip.ave.monthly的第一个维度里的呢??
楼主: andrew43 (讨厌有好心推文后删文者)   2018-10-24 16:59:00
这应该是因为tapply()一次有12个值,所以apply自动把它安排在第一个维度。没有哪段码刻意要求达到这种结果。再接一个aperm(..., c(2,3,1))转换过来就好了另外,单用apply算降雨年平均后只有二维度,并没有时间.
作者: AndrewShi (没有妳的我)   2018-10-24 22:25:00
了解,真的非常感谢andrew大,让我学到很多~andrew大~想再请教你如果想用循环的概念来写的话,我想到的写法是:for(i in (1:1440)){for(j in (1:400)){mean(precip[i,j,time=(1:31)])}}但跑出来也只有一个值,所以想请教你我的循环写法(概念)是哪里有出错吗??
楼主: andrew43 (讨厌有好心推文后删文者)   2018-10-25 16:47:00
这样是各别算出每个地点一月份的平均雨量,一次算一个。那还不如写成apply(precip[,,1:31], c(1,2), mean)你若想用for loop一次算一个地点,要把结果填到一个容器中,例如一个400*1440矩阵中。
作者: AndrewShi (没有妳的我)   2018-10-25 17:09:00
了解,非常感谢~
楼主: andrew43 (讨厌有好心推文后删文者)   2018-10-27 18:28:00
嗯嗯对等等。第一句不对啊。干嘛把容器的值在计算前就填入旧值。我的例子不是这么写的
作者: AndrewShi (没有妳的我)   2018-11-02 16:31:00
抱歉,andrew大,刚刚才看到你最后的回复,所以我要改成precip1 <- matrix(precip1,1440,400)这样才对吗?!
楼主: andrew43 (讨厌有好心推文后删文者)   2018-11-02 16:56:00
创造一个矩阵,里面先全填成NA或0或某个特定数字都好若填成NA,之后你loop完之后,如果还有NA就表示过程有问题。你先填入旧资料就不能辨视出哪个值可能有问题了。现在你又问是不是先填入precip1,问题是precip1还不存在前不可能,就像a未定义时 a <- a+1 怎么进行?
作者: AndrewShi (没有妳的我)   2018-11-02 18:16:00
了解XD,所以我的precip1要改成NA_real_,先把这个建立出来空的矩阵(precip1)先(随便)填个值(NA或0),之后再把算出来的平均降雨值填到这个矩阵里。
楼主: andrew43 (讨厌有好心推文后删文者)   2018-11-02 19:04:00
我是这样的意思没错
作者: AndrewShi (没有妳的我)   2018-11-07 17:19:00
andrew大~我想请教你一个问题,如果画图的部分我想画特定区域的话(如:东亚),改image里的经.纬度范围和月平均降雨里的经.纬度范围可以画的出来,但是之后再叠加世界地图(有设成同样范围)的时候画不出来(它有显示有多少个警告讯息),但我打warnings( ),它也没列出警告讯息,想请教你这个问题该怎么解决呢??
楼主: andrew43 (讨厌有好心推文后删文者)   2018-11-08 10:36:00
请不要一直在推文中提出新问题。发文并附code
作者: AndrewShi (没有妳的我)   2018-11-08 12:01:00
好的。

Links booklink

Contact Us: admin [ a t ] ucptt.com