[问题] 循环问题

楼主: AndrewShi (没有妳的我)   2019-01-24 15:56:08
[问题类型]:
程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
[软件熟悉度]:
入门(写过其他程式,只是对语法不熟悉)
[问题叙述]:
各位大大好,小弟我想要将台湾多年的降雨观测资料去计算一些降雨指标,而我所用
的观测资料将台湾范围的经纬度切成60x81格,而我所要计算的降雨指标也需要一格一格
网格点去计算(无法所有网格点同时计算),因此必须写循环,但这个降雨指标在单一格网
格点上一年会算出一个值,所以我会再将多年的值求平均,以代表这个网格点长时间平均
的降雨指标值,之后再将每格网格点的值放入一个矩阵中,以利最后我能画图。下面是我所写的程式码,希望大大们能提供指点,谢谢,降雨观测资料可从这里取得
:http://0rz.tw/JI056。
[程式范例]:
library(ncdf4)
library(climdex.pcic)
#读档.变量
memory.limit(size=50000)
TCCIP_file <- "C:\\Users\\TOM\\Desktop\\R(数据库)\\TCCIP观测资料
\\Daily\\pr_day_tccip5kmV2_1960-2015.nc"
TCCIP_data <- nc_open(TCCIP_file)
print(TCCIP_data)
obs_lon <- ncvar_get(TCCIP_data,"lon")
obs_lat <- ncvar_get(TCCIP_data,"lat")
obs_time <- ncvar_get(TCCIP_data,"time")
obs_time <- seq(as.POSIXct("1960-01-01"), as.POSIXct("2015-12-31"), by="day")
obs_pr <- ncvar_get(TCCIP_data,"pr")
#obs_pr <- ncvar_get(TCCIP_data,"pr",start=c(25,25,1),count=c(1,1,20454))
dim(obs_pr)
#降雨指标之计算
#5.rnnmm(Annual count of days when PRCP>1mm)
obs_pr.dates <- as.PCICt(obs_time,cal="365_day",origin="1960-01-01")
rnnmm.mean <- matrix(NA_real_,nrow=60,ncol=81)
for(i in c(1:60)){
for(j in c(1:81)){
obs_pr <- ncvar_get(TCCIP_data,"pr",start=c(i,j,1),count=c(1,1,20454))
#把要计算降雨指标的资料和时间放入
obs <- climdexInput.raw(tmax = NULL, tmin = NULL,prec=obs_pr,tmax.dates = NULL
,tmin.dates = NULL, prec.dates=obs_pr.dates,base.range=c(1960,2015),northern.h
emisphere=TRUE)
#计算资料的降雨指标值
rnnmm <- climdex.rnnmm(obs)
#将多年的降雨指标值取平均
rnnmm.mean <- mean(rnnmm)
}
}
View(rnnmm.mean)
[环境叙述]:
[关键字]:
for循环 降雨指标 经纬度
作者: andrew43 (讨厌有好心推文后删文者)   2019-01-24 17:02:00
for loop中你用了j <- j + 1; i <- i + 1之类的应该错了for(i in 1:3)就是每一圈会自动让i+1啊,不必自己手动。最终目标rnnmm.mean应该也要是一个60*81的matrix,不是一个单一值。你目前只有单一值会被记录。应该要写成rnnmm.mean[i,j] <- mean(rnnmm)才行。climdexInput.raw()和climdex.rnnmm()怎么使用我不了解但看来climdexInput.raw()你也没有正确使用它,请看手册
楼主: AndrewShi (没有妳的我)   2019-01-25 00:54:00
了解,不过andrew大,我改成你说的那样反而出现error。mean(rnnmm)出来是一个值,我只是想把每个网格点算出来的值再放到一个矩阵里。" target="_blank" rel="nofollow">
climdexInput.raw()里面放的是要计算的资料(变量)和时间,两者的长度要一样,如果i.j给它某个值,汇入的就会是某个网格点所有时间的降雨值,而climdex.rnnmm则是把这个网格点所有时间的降雨值去做统计分析,最后输出每年的统计值,最后mean()出来则是比如30年的平均值。
作者: andrew43 (讨厌有好心推文后删文者)   2019-01-25 08:33:00
你说的我可以明白。不过你的code还是有些莫名其妙之处。例如我先前说过的,以及有些物件被多次定义,还有些未定义物件。
楼主: AndrewShi (没有妳的我)   2019-01-26 01:23:00
andrew大是指obs和rnnmm被多次定义吗?!可是我每算一次出来的值就会被丢到矩阵里应该没问题吧?!未被定义的是?
作者: andrew43 (讨厌有好心推文后删文者)   2019-01-26 07:22:00
你开新的session只跑你的code看看吧
楼主: AndrewShi (没有妳的我)   2019-01-26 13:59:00
跑是可以跑,只是print(rnnmm.mean)出来只会有一个值。andrew大~我最多就只想到改成上面那样,还烦请你指点了
作者: andrew43 (讨厌有好心推文后删文者)   2019-01-26 21:13:00
Error: object 'CI_output' not foundrnnmm.mean <- 改 rnnmm.mean[i,j] <- ,之前也有说过。mean(rnnmm)视情况可以改成mean(rnnmm, na.rm = T)看来算得很慢且都是NA,我没等到跑完就没耐心了。你试试如果有错,不要只重跑for的部分,要全部重跑
楼主: AndrewShi (没有妳的我)   2019-01-27 01:19:00
" target="_blank" rel="nofollow">
andrew大~我会出现这个error,我是用另一个观测资料,所以变量名称不同,且有重跑。
作者: Gjerry   2019-01-27 11:25:00
rnnmm.mean[I, j]是矩阵里面的一格你直接指定一个矩阵给他,所以发生错误
楼主: AndrewShi (没有妳的我)   2019-01-27 13:22:00
了解,我有成功跑出来了,非常谢谢andrew大^^andrew大~不好意思想再请教你,我今天下午的确有跑成功但当我改变量名称之后再去跑就会出现下图中最上面和最下面的这两个错误,我有上网查错误讯息,好像for循环常会跑出下面这个错误讯息,还是是我改的程式码还是有问题呢??" target="_blank" rel="nofollow">
我有重跑和重开R跑过,但都还是会出现上面那两个error
作者: andrew43 (讨厌有好心推文后删文者)   2019-01-27 22:35:00
衷心给你一个建议,找一本书好好从基本功开始。你在指定i*j大小矩阵时,你真的确定i和j当下是多少吗?特别是之前的for loop并没有成功。最后错误讯息的意思如同五个资料塞到三个格子不够塞
楼主: AndrewShi (没有妳的我)   2019-01-28 01:01:00
不瞒andrew大,老实说我有2本R的书(轻松学习R语言.R锦囊妙计),前面这本我几乎整本看完,里面介绍的指令我也都有try过,但我觉得书比如介绍矩阵的部分都太粗浅,我
作者: andrew43 (讨厌有好心推文后删文者)   2019-01-28 01:07:00
这二本书我印像中都不错。个人感觉你有些很基础的概念学没到位。例如最后这个问题,其实当下检查i和j就解开了。
楼主: AndrewShi (没有妳的我)   2019-01-28 01:12:00
们真正在写.应用的程式码都复杂很多,不过我也承认我基我知道,i.j不就是我资料经.纬度的维度吗?!
作者: andrew43 (讨厌有好心推文后删文者)   2019-01-28 01:16:00
i和j被你用在for之中,但你之前的for根本没跑完,所以i和j可能都还只是1。因此你应该用length(obs_lat)之类的东西来指定矩阵尺度在看到最后一个warning时应马上检查dim(CI.rnnmm.mean)你不应把i当成经度个数,而要把它当成for之中变来变去的变量。谁知道它变到最后是不是一定变到终点?又如果哪天你希望for中i从大变到小,那最后i是1,怎办?
楼主: AndrewShi (没有妳的我)   2019-01-28 16:49:00
了解,我好像懂了,我说一下我的理解不确定对不对。" target="_blank" rel="nofollow">
一开始先创一个跟资料总长度一样大的矩阵(都塞NA值),之后再算选定(i.j)网格点的值,算完之后再把值填到原先创的矩阵里。
作者: andrew43 (讨厌有好心推文后删文者)   2019-01-28 17:27:00
for结束后CI_rnnmm_mean不用再“塞到同样大小的矩阵里”那列code打了等于白打,就好像说了a=1再说a=a一样没意义如果都没有出错,记得拿笔资料手动验算一下。
楼主: AndrewShi (没有妳的我)   2019-01-28 21:03:00
了解,谢谢andrew大

Links booklink

Contact Us: admin [ a t ] ucptt.com