[問題] 迴圈問題

作者: 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)出來是一個值,我只是想把每個網格點算出來的值再放到一個矩陣裡。https://imgur.com/i40MRR9climdexInput.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
https://imgur.com/0ur3ojGandrew大~我會出現這個error,我是用另一個觀測資料,所以變數名稱不同,且有重跑。
作者: Gjerry   2019-01-27 11:25:00
rnnmm.mean[I, j]是矩陣裡面的一格你直接指定一個矩陣給他,所以發生錯誤
作者: AndrewShi (沒有妳的我)   2019-01-27 13:22:00
了解,我有成功跑出來了,非常謝謝andrew大^^andrew大~不好意思想再請教你,我今天下午的確有跑成功但當我改變數名稱之後再去跑就會出現下圖中最上面和最下面的這兩個錯誤,我有上網查錯誤訊息,好像for迴圈常會跑出下面這個錯誤訊息,還是是我改的程式碼還是有問題呢??https://imgur.com/JiLVdxk我有重跑和重開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
了解,我好像懂了,我說一下我的理解不確定對不對。https://imgur.com/DK1E2eH一開始先創一個跟資料總長度一樣大的矩陣(都塞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