[問題] 迴圈問題

看板R_Language作者 (沒有妳的我)時間5年前 (2019/01/24 15:56), 5年前編輯推噓2(2056)
留言58則, 3人參與, 5年前最新討論串1/1
[問題類型]: 程式諮詢(我想用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迴圈 降雨指標 經緯度 --

01/25 08:33, 5年前 , 1F
你說的我可以明白。不過你的code還是有些莫名其妙之處。
01/25 08:33, 1F

01/25 08:36, 5年前 , 2F
例如我先前說過的,以及有些物件被多次定義,還有些未定
01/25 08:36, 2F

01/25 08:36, 5年前 , 3F
義物件。
01/25 08:36, 3F

01/26 01:23, 5年前 , 4F
andrew大是指obs和rnnmm被多次定義嗎?!可是我每算一次
01/26 01:23, 4F
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.217.194.25 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1548316570.A.867.html

01/24 17:02, 5年前 , 5F
for loop中你用了j <- j + 1; i <- i + 1之類的應該錯了
01/24 17:02, 5F

01/24 17:03, 5年前 , 6F
for(i in 1:3)就是每一圈會自動讓i+1啊,不必自己手動。
01/24 17:03, 6F

01/24 17:04, 5年前 , 7F
最終目標rnnmm.mean應該也要是一個60*81的matrix,不是
01/24 17:04, 7F

01/24 17:04, 5年前 , 8F
一個單一值。你目前只有單一值會被記錄。
01/24 17:04, 8F

01/24 17:05, 5年前 , 9F
應該要寫成rnnmm.mean[i,j] <- mean(rnnmm)才行。
01/24 17:05, 9F

01/24 17:06, 5年前 , 10F
climdexInput.raw()和climdex.rnnmm()怎麼使用我不了解
01/24 17:06, 10F

01/24 17:07, 5年前 , 11F
但看來climdexInput.raw()你也沒有正確使用它,請看手冊
01/24 17:07, 11F

01/25 00:54, 5年前 , 12F
了解,不過andrew大,我改成你說的那樣反而出現error。
01/25 00:54, 12F

01/26 01:28, 5年前 , 13F
出來的值就會被丟到矩陣裡應該沒問題吧?!未被定義的是?
01/26 01:28, 13F

01/26 07:22, 5年前 , 14F
你開新的session只跑你的code看看吧
01/26 07:22, 14F

01/26 13:59, 5年前 , 15F
跑是可以跑,只是print(rnnmm.mean)出來只會有一個值。
01/26 13:59, 15F

01/26 14:55[程式範例]:, , 16F
只有一個值的問題我前面提過,你可以修看看。
01/26 14:55[程式範例]:, 16F
※ 編輯: 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

01/26 17:11, 5年前 , 17F
andrew大~我最多就只想到改成上面那樣,還煩請你指點了
01/26 17:11, 17F
※ 編輯: AndrewShi (180.217.114.34), 01/26/2019 17:15:38

01/26 21:13, 5年前 , 18F
Error: object 'CI_output' not found
01/26 21:13, 18F
※ 編輯: AndrewShi (180.217.114.34), 01/26/2019 22:39:43

01/26 22:52, 5年前 , 19F
rnnmm.mean <- 改 rnnmm.mean[i,j] <- ,之前也有說過。
01/26 22:52, 19F

01/26 22:53, 5年前 , 20F
mean(rnnmm)視情況可以改成mean(rnnmm, na.rm = T)
01/26 22:53, 20F

01/26 22:54, 5年前 , 21F
看來算得很慢且都是NA,我沒等到跑完就沒耐心了。你試試
01/26 22:54, 21F

01/26 22:55, 5年前 , 22F
如果有錯,不要只重跑for的部分,要全部重跑
01/26 22:55, 22F

01/27 01:19, 5年前 , 23F

01/27 01:21, 5年前 , 24F
andrew大~我會出現這個error,我是用另一個觀測資料,
01/27 01:21, 24F

01/27 01:22, 5年前 , 25F
所以變數名稱不同,且有重跑。
01/27 01:22, 25F

01/27 11:25, 5年前 , 26F
rnnmm.mean[I, j]是矩陣裡面的一格
01/27 11:25, 26F

01/27 11:26, 5年前 , 27F
你直接指定一個矩陣給他,所以發生錯誤
01/27 11:26, 27F

01/27 13:22, 5年前 , 28F
了解,我有成功跑出來了,非常謝謝andrew大^^
01/27 13:22, 28F

01/27 21:55, 5年前 , 29F
andrew大~不好意思想再請教你,我今天下午的確有跑成功
01/27 21:55, 29F

01/27 21:56, 5年前 , 30F
但當我改變數名稱之後再去跑就會出現下圖中最上面和最
01/27 21:56, 30F

01/27 21:59, 5年前 , 31F
下面的這兩個錯誤,我有上網查錯誤訊息,好像for迴圈常
01/27 21:59, 31F

01/27 22:00, 5年前 , 32F
會跑出下面這個錯誤訊息,還是是我改的程式碼還是有問
01/27 22:00, 32F

01/27 22:01, 5年前 , 33F
題呢??
01/27 22:01, 33F

01/27 22:02, 5年前 , 34F

01/27 22:06, 5年前 , 35F
我有重跑和重開R跑過,但都還是會出現上面那兩個error
01/27 22:06, 35F

01/27 22:35, 5年前 , 36F
衷心給你一個建議,找一本書好好從基本功開始。
01/27 22:35, 36F

01/27 22:38, 5年前 , 37F
你在指定i*j大小矩陣時,你真的確定i和j當下是多少嗎?
01/27 22:38, 37F

01/27 22:38, 5年前 , 38F
特別是之前的for loop並沒有成功。
01/27 22:38, 38F

01/27 22:41, 5年前 , 39F
最後錯誤訊息的意思如同五個資料塞到三個格子不夠塞
01/27 22:41, 39F

01/28 01:01, 5年前 , 40F
不瞞andrew大,老實說我有2本R的書(輕鬆學習R語言.R錦
01/28 01:01, 40F

01/28 01:03, 5年前 , 41F
囊妙計),前面這本我幾乎整本看完,裡面介紹的指令我也
01/28 01:03, 41F

01/28 01:06, 5年前 , 42F
都有try過,但我覺得書比如介紹矩陣的部分都太粗淺,我
01/28 01:06, 42F

01/28 01:07, 5年前 , 43F
這二本書我印像中都不錯。個人感覺你有些很基礎的概念學
01/28 01:07, 43F

01/28 01:08, 5年前 , 44F
沒到位。例如最後這個問題,其實當下檢查i和j就解開了。
01/28 01:08, 44F

01/28 01:12, 5年前 , 45F
們真正在寫.應用的程式碼都複雜很多,不過我也承認我基
01/28 01:12, 45F

01/28 01:15, 5年前 , 46F
我知道,i.j不就是我資料經.緯度的維度嗎?!
01/28 01:15, 46F

01/28 01:16, 5年前 , 47F
i和j被你用在for之中,但你之前的for根本沒跑完,所以
01/28 01:16, 47F

01/28 01:16, 5年前 , 48F
i和j可能都還只是1。
01/28 01:16, 48F

01/28 01:17, 5年前 , 49F
因此你應該用length(obs_lat)之類的東西來指定矩陣尺度
01/28 01:17, 49F

01/28 01:18, 5年前 , 50F
在看到最後一個warning時應馬上檢查dim(CI.rnnmm.mean)
01/28 01:18, 50F

01/28 01:20, 5年前 , 51F
你不應把i當成經度個數,而要把它當成for之中變來變去的
01/28 01:20, 51F

01/28 01:21, 5年前 , 52F
變數。誰知道它變到最後是不是一定變到終點?
01/28 01:21, 52F

01/28 01:22, 5年前 , 53F
又如果哪天你希望for中i從大變到小,那最後i是1,怎辦?
01/28 01:22, 53F

01/28 16:49, 5年前 , 54F
了解,我好像懂了,我說一下我的理解不確定對不對。
01/28 16:49, 54F

01/28 16:49, 5年前 , 55F

01/28 16:52, 5年前 , 56F
一開始先創一個跟資料總長度一樣大的矩陣(都塞NA值),
01/28 16:52, 56F

01/28 16:54, 5年前 , 57F
之後再算選定(i.j)網格點的值,算完之後再把值填到原先
01/28 16:54, 57F

01/28 16:55, 5年前 , 58F
創的矩陣裡。
01/28 16:55, 58F

01/28 17:27, 5年前 , 59F
for結束後CI_rnnmm_mean不用再「塞到同樣大小的矩陣裡」
01/28 17:27, 59F

01/28 17:29, 5年前 , 60F
那列code打了等於白打,就好像說了a=1再說a=a一樣沒意義
01/28 17:29, 60F

01/28 17:30, 5年前 , 61F
如果都沒有出錯,記得拿筆資料手動驗算一下。
01/28 17:30, 61F

01/28 21:03, 5年前 , 62F
了解,謝謝andrew大
01/28 21:03, 62F
文章代碼(AID): #1SIM-QXd (R_Language)
文章代碼(AID): #1SIM-QXd (R_Language)