[問題] 將資料時間按月份計算(迴圈)

看板R_Language作者 (沒有妳的我)時間6年前 (2018/11/13 17:47), 6年前編輯推噓1(1057)
留言58則, 3人參與, 6年前最新討論串1/1
[問題類型]: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) [軟體熟悉度]: 入門(寫過其他程式,只是對語法不熟悉) [問題敘述]: 這筆資料為2010年全球的降雨資料,資料可從這裡取得:http://0rz.tw/JI056,資料的時 間格式為24小時一筆,總共365筆,現在我想先把時間的格式轉成年月日(如:2010-01-01) ,再判斷日期的月份來做計算(迴圈),之前有大大解答我是用apply的做法,我也知道在 R裡用apply會比用迴圈來的有效率,不過我想用自己理解的邏輯來寫迴圈做練習,而下面 我所寫的迴圈我知道其中一個問題是time1的維度還是365(雖然數字變成1~12),我不知道 該怎麼把time1(按月份分好的365天)放到一個12格的矩陣裡,所以想請教各位大大下面的 迴圈該如何修改才正確呢??謝謝。 [程式範例]: rm(list=ls()) library(ncdf4) library(data.table) 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") nc_close(obs) for(tmonth in c(1:12)){ for(time1 in c(1:365)){ time <- as.Date(time / 24, format = "%Y-%m-%d", origin = "2010-01-01") time1 <- strftime(time,format="%Y-%m-%d) tmonth <- month(time1) if(tmonth==time1){ precip1 <- precip[,,tmonth] precip2 <- array(NA_real_,dim=c(1440,400,12)) for(i in c(1:1440)){ for(j in c(1:400)){ precip2[i,j,1:12] <- mean(precip1[i,j,tmonth]) } } } } } library(sp) library(RColorBrewer) image(lon,lat,precip2[,,1],col=rev(brewer.pal(10,"RdBu"))) [環境敘述]: [關鍵字]: 時間處理 迴圈 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.122.136.30 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1542102427.A.E65.html

11/13 19:28, 6年前 , 1F
我覺得你的問題是你沒想清楚要怎麼算,而不是R的問題。
11/13 19:28, 1F

11/13 19:32, 6年前 , 2F
要從365層分組平均成12層,你想要迴圈怎麼「走」?
11/13 19:32, 2F

11/13 19:36, 6年前 , 3F
另你在判斷「某一天屬於哪一月」就真的不知所云...
11/13 19:36, 3F

11/13 19:40, 6年前 , 4F
a<-1:5; b<-c("A","A","B","B","B"); 先練好把a按b分組
11/13 19:40, 4F

11/13 19:41, 6年前 , 5F
平均得到c(1.5,4)結果且不要用apply系列的寫法
11/13 19:41, 5F

11/13 19:45, 6年前 , 6F
我想讓365天按照日期讓R來判斷這是幾月的資料,是一月
11/13 19:45, 6F

11/13 19:45, 6年前 , 7F
就加總前31天的資料,是二月的就加總第32~59天的資料,
11/13 19:45, 7F

11/13 19:45, 6年前 , 8F
最後加總成總共12個月。
11/13 19:45, 8F

11/13 19:45, 6年前 , 9F
好的,我先試試看。
11/13 19:45, 9F

11/13 20:37, 6年前 , 10F
你的算法很不方便,還要額外處理某個月是當年的第幾天
11/13 20:37, 10F

11/13 20:38, 6年前 , 11F
當然這有額外的function可以處理。
11/13 20:38, 11F

11/13 20:38, 6年前 , 12F
此外,如此一來,不應該會有四層for loop。
11/13 20:38, 12F

11/13 20:41, 6年前 , 13F
我猜你把我的小問題做出來,你也就自然解決了。
11/13 20:41, 13F

11/14 01:51, 6年前 , 14F
andrew大可以給我一點提示嗎??我目前只想到,names(a)
11/14 01:51, 14F

11/14 01:51, 6年前 , 15F
<- b,我不確定這是不是把a按b分組的意思。
11/14 01:51, 15F

11/14 08:50, 6年前 , 16F
11/14 08:50, 16F

11/14 12:34, 6年前 , 17F
andrew大~你給我的這段程式碼是把365天按照2018年的月
11/14 12:34, 17F

11/14 12:34, 6年前 , 18F
份和日數去分組,最後再從1+2+3+...365除上每個月的天
11/14 12:34, 18F

11/14 12:34, 6年前 , 19F
數的意思嗎?!
11/14 12:34, 19F
抱歉,我可能沒有把想做的事說清楚,我的確是也想把天數和月份做連結,但上面的程式 碼我是想讓它當time1=1,time=1進來迴圈之後,判斷是幾月份的降雨值,如果判斷是1月 ,那麼就會等於time1的1,然後就會把判斷為1月份的降雨值做相加。 當time=32的時候,它會判斷為2月(的降雨值),此時time=32就不會等於time1的1,所以 第31個值後面所有的值就都不符合if判斷式,最後跳到time1=2,time=1繼續跑,time=32 才會開始符合條件,之後便是相加2月的降雨值,以此類推,最後再把365天的降雨值放到 12格的盒子裡。 ※ 編輯: AndrewShi (110.50.156.45), 11/14/2018 12:50:45

11/14 14:08, 6年前 , 20F
對,我是這樣算。
11/14 14:08, 20F

11/14 14:10, 6年前 , 21F
你的方法也可以,但你的code我看不出來是在做這件事。
11/14 14:10, 21F

11/14 14:33, 6年前 , 22F
先不要把for loop變動變數和原本存在的變數有一樣的名字
11/14 14:33, 22F
※ 編輯: AndrewShi (110.50.156.45), 11/14/2018 15:44:44 ※ 編輯: AndrewShi (110.50.156.45), 11/14/2018 15:45:44

11/14 15:52, 6年前 , 23F
andrew大~我稍微改了一下上面的程式碼,但還是不行,
11/14 15:52, 23F

11/14 15:52, 6年前 , 24F
我也覺得還是怪怪的,但不知道該怎麼改,tmonth有365
11/14 15:52, 24F

11/14 15:53, 6年前 , 25F
個數字(1~12),我不知道該怎麼把都是1的那31天的降雨
11/14 15:53, 25F

11/14 15:53, 6年前 , 26F
值放入同一格裡。
11/14 15:53, 26F

11/14 15:54, 6年前 , 27F

11/14 16:59, 6年前 , 28F
tmonth <- month(time1) 和 for loop的tmonth打架
11/14 16:59, 28F

11/14 17:03, 6年前 , 29F
潑你個冷水,你堅持四層loop的運算量實在很浪費力氣
11/14 17:03, 29F

11/14 17:05, 6年前 , 30F
另外,建議先退回到我給的例子,用你自己的方法重新寫。
11/14 17:05, 30F

11/14 17:05, 6年前 , 31F
在重寫之前先用紙筆把program flow chart畫出來再寫
11/14 17:05, 31F

11/14 17:06, 6年前 , 32F
flow chart中要儘可能包括所有細節
11/14 17:06, 32F

11/14 23:42, 6年前 , 33F
andrew大~打架是指??我的最後2個迴圈是在做降雨值的加
11/14 23:42, 33F

11/14 23:43, 6年前 , 34F
總,能否請教andrew大我的迴圈有缺或錯哪些地方嗎??如
11/14 23:43, 34F

11/14 23:43, 6年前 , 35F
果沒有錯的很離譜,我想看自己能不能修改並完成它(畢
11/14 23:43, 35F

11/14 23:43, 6年前 , 36F
竟是用自己的邏輯寫的),至於你給我的那段程式碼,我也
11/14 23:43, 36F

11/14 23:43, 6年前 , 37F
只是勉強看的懂,但我還真的不知道也想不到要那樣寫。
11/14 23:43, 37F

11/15 00:03, 6年前 , 38F
對於tmonth你一開始的設定是c(1:12),結果到迴圈裡
11/15 00:03, 38F

11/15 00:03, 6年前 , 39F
面你又讓他跟著你的time1做變化,這樣第一個迴圈是
11/15 00:03, 39F

11/15 00:03, 6年前 , 40F
不是可以去掉?
11/15 00:03, 40F

11/15 00:05, 6年前 , 41F
其實就連你的time1都是會變動的,所以前兩個for迴圈
11/15 00:05, 41F

11/15 00:05, 6年前 , 42F
根本是沒意義的吧?
11/15 00:05, 42F

11/15 00:57, 6年前 , 43F
因為你的code有很多詭異之處,我不能明白你的困難點在哪
11/15 00:57, 43F

11/15 00:59, 6年前 , 44F
所以我才建議你先簡化問題,先用例子中已知部份重寫一次
11/15 00:59, 44F

11/15 01:00, 6年前 , 45F
看看能不能讓我或你自覺你的關鍵問題是什麼。
11/15 01:00, 45F

11/15 01:01, 6年前 , 46F
至於你說你也會想不到原來可以有不同寫法,這很正常的。
11/15 01:01, 46F

11/15 01:02, 6年前 , 47F
不用太在意,先看懂別人的code邏輯是什麼就好。
11/15 01:02, 47F

11/15 01:45, 6年前 , 48F
好的,那我明天再來好好的想,謝謝andrew大。
11/15 01:45, 48F

11/15 17:46, 6年前 , 49F
先給你模仿你想法的一種解法。卡關時再開來看。
11/15 17:46, 49F

11/15 17:47, 6年前 , 50F
https://ideone.com/kFZTlu 留意一些for loop小技巧
11/15 17:47, 50F

11/15 17:48, 6年前 , 51F
例如 var.N 就是常見的計數器寫法。
11/15 17:48, 51F

11/22 12:31, 6年前 , 52F
了解,非常謝謝andrew大,我的想法的確是你後面傳給我
11/22 12:31, 52F

11/22 12:31, 6年前 , 53F
的這個寫法,再看了你的程式碼之後我有想出來要怎麼寫
11/22 12:31, 53F

11/22 12:31, 6年前 , 54F
了。
11/22 12:31, 54F

11/22 17:15, 6年前 , 55F
andrew大~想請問你確認一下這個迴圈概念套用在兩年或是
11/22 17:15, 55F

11/22 17:15, 6年前 , 56F
多年的資料上應該也可以吧?!就是算兩年(或多年)一月份
11/22 17:15, 56F

11/22 17:15, 6年前 , 57F
的平均降雨值
11/22 17:15, 57F

11/22 20:59, 6年前 , 58F
可以。分群平均時的組別有包含年和月就沒問題。
11/22 20:59, 58F
文章代碼(AID): #1RwfsRvb (R_Language)
文章代碼(AID): #1RwfsRvb (R_Language)