作者AndrewShi (没有你的我)
看板R_Language
标题[问题] 回圈问题
时间Thu Jan 24 15:56:08 2019
[问题类型]:
程式谘询(我想用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回圈 降雨指标 经纬度
--
1F:→ andrew43: 你说的我可以明白。不过你的code还是有些莫名其妙之处。01/25 08:33
2F:→ andrew43: 例如我先前说过的,以及有些物件被多次定义,还有些未定01/25 08:36
3F:→ andrew43: 义物件。01/25 08:36
4F:→ AndrewShi: andrew大是指obs和rnnmm被多次定义吗?!可是我每算一次01/26 01:23
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 180.217.194.25
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1548316570.A.867.html
5F:→ andrew43: for loop中你用了j <- j + 1; i <- i + 1之类的应该错了01/24 17:02
6F:→ andrew43: for(i in 1:3)就是每一圈会自动让i+1啊,不必自己手动。01/24 17:03
7F:→ andrew43: 最终目标rnnmm.mean应该也要是一个60*81的matrix,不是01/24 17:04
8F:→ andrew43: 一个单一值。你目前只有单一值会被记录。01/24 17:04
9F:→ andrew43: 应该要写成rnnmm.mean[i,j] <- mean(rnnmm)才行。01/24 17:05
10F:→ andrew43: climdexInput.raw()和climdex.rnnmm()怎麽使用我不了解01/24 17:06
11F:→ andrew43: 但看来climdexInput.raw()你也没有正确使用它,请看手册01/24 17:07
12F:→ AndrewShi: 了解,不过andrew大,我改成你说的那样反而出现error。01/25 00:54
13F:→ AndrewShi: 出来的值就会被丢到矩阵里应该没问题吧?!未被定义的是?01/26 01:28
14F:推 andrew43: 你开新的session只跑你的code看看吧01/26 07:22
15F:→ AndrewShi: 跑是可以跑,只是print(rnnmm.mean)出来只会有一个值。01/26 13:59
16F:推 andrew43: 只有一个值的问题我前面提过,你可以修看看。01/26 14:55[程式范例]:
※ 编辑: AndrewShi (180.217.114.34), 01/26/2019 16:50:03
※ 编辑: AndrewShi (180.217.114.34), 01/26/2019 17:02:59
※ 编辑: AndrewShi (180.217.114.34), 01/26/2019 17:05:05
17F:→ AndrewShi: andrew大~我最多就只想到改成上面那样,还烦请你指点了 01/26 17:11
※ 编辑: AndrewShi (180.217.114.34), 01/26/2019 17:15:38
18F:→ andrew43: Error: object 'CI_output' not found 01/26 21:13
※ 编辑: AndrewShi (180.217.114.34), 01/26/2019 22:39:43
19F:→ andrew43: rnnmm.mean <- 改 rnnmm.mean[i,j] <- ,之前也有说过。 01/26 22:52
20F:→ andrew43: mean(rnnmm)视情况可以改成mean(rnnmm, na.rm = T) 01/26 22:53
21F:→ andrew43: 看来算得很慢且都是NA,我没等到跑完就没耐心了。你试试 01/26 22:54
22F:→ andrew43: 如果有错,不要只重跑for的部分,要全部重跑 01/26 22:55
24F:→ AndrewShi: andrew大~我会出现这个error,我是用另一个观测资料, 01/27 01:21
25F:→ AndrewShi: 所以变数名称不同,且有重跑。 01/27 01:22
26F:→ Gjerry: rnnmm.mean[I, j]是矩阵里面的一格 01/27 11:25
27F:→ Gjerry: 你直接指定一个矩阵给他,所以发生错误 01/27 11:26
28F:→ AndrewShi: 了解,我有成功跑出来了,非常谢谢andrew大^^ 01/27 13:22
29F:→ AndrewShi: andrew大~不好意思想再请教你,我今天下午的确有跑成功 01/27 21:55
30F:→ AndrewShi: 但当我改变数名称之後再去跑就会出现下图中最上面和最 01/27 21:56
31F:→ AndrewShi: 下面的这两个错误,我有上网查错误讯息,好像for回圈常 01/27 21:59
32F:→ AndrewShi: 会跑出下面这个错误讯息,还是是我改的程式码还是有问 01/27 22:00
33F:→ AndrewShi: 题呢?? 01/27 22:01
35F:→ AndrewShi: 我有重跑和重开R跑过,但都还是会出现上面那两个error 01/27 22:06
36F:→ andrew43: 衷心给你一个建议,找一本书好好从基本功开始。 01/27 22:35
37F:→ andrew43: 你在指定i*j大小矩阵时,你真的确定i和j当下是多少吗? 01/27 22:38
38F:→ andrew43: 特别是之前的for loop并没有成功。 01/27 22:38
39F:→ andrew43: 最後错误讯息的意思如同五个资料塞到三个格子不够塞 01/27 22:41
40F:→ AndrewShi: 不瞒andrew大,老实说我有2本R的书(轻松学习R语言.R锦 01/28 01:01
41F:→ AndrewShi: 囊妙计),前面这本我几乎整本看完,里面介绍的指令我也 01/28 01:03
42F:→ AndrewShi: 都有try过,但我觉得书比如介绍矩阵的部分都太粗浅,我 01/28 01:06
43F:→ andrew43: 这二本书我印像中都不错。个人感觉你有些很基础的概念学 01/28 01:07
44F:→ andrew43: 没到位。例如最後这个问题,其实当下检查i和j就解开了。 01/28 01:08
45F:→ AndrewShi: 们真正在写.应用的程式码都复杂很多,不过我也承认我基 01/28 01:12
46F:→ AndrewShi: 我知道,i.j不就是我资料经.纬度的维度吗?! 01/28 01:15
47F:→ andrew43: i和j被你用在for之中,但你之前的for根本没跑完,所以 01/28 01:16
48F:→ andrew43: i和j可能都还只是1。 01/28 01:16
49F:→ andrew43: 因此你应该用length(obs_lat)之类的东西来指定矩阵尺度 01/28 01:17
50F:→ andrew43: 在看到最後一个warning时应马上检查dim(CI.rnnmm.mean) 01/28 01:18
51F:→ andrew43: 你不应把i当成经度个数,而要把它当成for之中变来变去的 01/28 01:20
52F:→ andrew43: 变数。谁知道它变到最後是不是一定变到终点? 01/28 01:21
53F:→ andrew43: 又如果哪天你希望for中i从大变到小,那最後i是1,怎办? 01/28 01:22
54F:→ AndrewShi: 了解,我好像懂了,我说一下我的理解不确定对不对。 01/28 16:49
56F:→ AndrewShi: 一开始先创一个跟资料总长度一样大的矩阵(都塞NA值), 01/28 16:52
57F:→ AndrewShi: 之後再算选定(i.j)网格点的值,算完之後再把值填到原先 01/28 16:54
58F:→ AndrewShi: 创的矩阵里。 01/28 16:55
59F:→ andrew43: for结束後CI_rnnmm_mean不用再「塞到同样大小的矩阵里」 01/28 17:27
60F:→ andrew43: 那列code打了等於白打,就好像说了a=1再说a=a一样没意义 01/28 17:29
61F:→ andrew43: 如果都没有出错,记得拿笔资料手动验算一下。 01/28 17:30
62F:→ AndrewShi: 了解,谢谢andrew大 01/28 21:03