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

作者: AndrewShi (沒有妳的我)   2018-11-13 17:47:04
[問題類型]:
程式諮詢(我想用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")))
[環境敘述]:
[關鍵字]:
時間處理 迴圈
作者: andrew43 (討厭有好心推文後刪文者)   2018-11-13 19:28:00
我覺得你的問題是你沒想清楚要怎麼算,而不是R的問題。要從365層分組平均成12層,你想要迴圈怎麼「走」?另你在判斷「某一天屬於哪一月」就真的不知所云...a<-1:5; b<-c("A","A","B","B","B"); 先練好把a按b分組平均得到c(1.5,4)結果且不要用apply系列的寫法
作者: AndrewShi (沒有妳的我)   2018-11-13 19:45:00
我想讓365天按照日期讓R來判斷這是幾月的資料,是一月就加總前31天的資料,是二月的就加總第32~59天的資料,最後加總成總共12個月。好的,我先試試看。
作者: andrew43 (討厭有好心推文後刪文者)   2018-11-13 20:37:00
你的算法很不方便,還要額外處理某個月是當年的第幾天當然這有額外的function可以處理。此外,如此一來,不應該會有四層for loop。我猜你把我的小問題做出來,你也就自然解決了。
作者: AndrewShi (沒有妳的我)   2018-11-14 01:51:00
andrew大可以給我一點提示嗎??我目前只想到,names(a)<- b,我不確定這是不是把a按b分組的意思。
作者: andrew43 (討厭有好心推文後刪文者)   2018-11-14 08:50:00
作者: AndrewShi (沒有妳的我)   2018-11-14 12:34:00
andrew大~你給我的這段程式碼是把365天按照2018年的月份和日數去分組,最後再從1+2+3+...365除上每個月的天數的意思嗎?!
作者: andrew43 (討厭有好心推文後刪文者)   2018-11-14 14:08:00
對,我是這樣算。你的方法也可以,但你的code我看不出來是在做這件事。先不要把for loop變動變數和原本存在的變數有一樣的名字
作者: AndrewShi (沒有妳的我)   2018-11-14 15:52:00
andrew大~我稍微改了一下上面的程式碼,但還是不行,我也覺得還是怪怪的,但不知道該怎麼改,tmonth有365個數字(1~12),我不知道該怎麼把都是1的那31天的降雨值放入同一格裡。https://i.imgur.com/MQFzcpY.jpg
作者: andrew43 (討厭有好心推文後刪文者)   2018-11-14 16:59:00
tmonth <- month(time1) 和 for loop的tmonth打架潑你個冷水,你堅持四層loop的運算量實在很浪費力氣另外,建議先退回到我給的例子,用你自己的方法重新寫。在重寫之前先用紙筆把program flow chart畫出來再寫flow chart中要儘可能包括所有細節
作者: AndrewShi (沒有妳的我)   2018-11-14 23:42:00
andrew大~打架是指??我的最後2個迴圈是在做降雨值的加總,能否請教andrew大我的迴圈有缺或錯哪些地方嗎??如果沒有錯的很離譜,我想看自己能不能修改並完成它(畢竟是用自己的邏輯寫的),至於你給我的那段程式碼,我也只是勉強看的懂,但我還真的不知道也想不到要那樣寫。
作者: rubythinking (ruby)   2018-11-15 00:03:00
對於tmonth你一開始的設定是c(1:12),結果到迴圈裡面你又讓他跟著你的time1做變化,這樣第一個迴圈是不是可以去掉?其實就連你的time1都是會變動的,所以前兩個for迴圈根本是沒意義的吧?
作者: andrew43 (討厭有好心推文後刪文者)   2018-11-15 00:57:00
因為你的code有很多詭異之處,我不能明白你的困難點在哪所以我才建議你先簡化問題,先用例子中已知部份重寫一次看看能不能讓我或你自覺你的關鍵問題是什麼。至於你說你也會想不到原來可以有不同寫法,這很正常的。不用太在意,先看懂別人的code邏輯是什麼就好。
作者: AndrewShi (沒有妳的我)   2018-11-15 01:45:00
好的,那我明天再來好好的想,謝謝andrew大。
作者: andrew43 (討厭有好心推文後刪文者)   2018-11-15 17:46:00
先給你模仿你想法的一種解法。卡關時再開來看。https://ideone.com/kFZTlu 留意一些for loop小技巧例如 var.N 就是常見的計數器寫法。
作者: AndrewShi (沒有妳的我)   2018-11-22 12:31:00
了解,非常謝謝andrew大,我的想法的確是你後面傳給我的這個寫法,再看了你的程式碼之後我有想出來要怎麼寫了。andrew大~想請問你確認一下這個迴圈概念套用在兩年或是多年的資料上應該也可以吧?!就是算兩年(或多年)一月份的平均降雨值
作者: andrew43 (討厭有好心推文後刪文者)   2018-11-22 20:59:00
可以。分群平均時的組別有包含年和月就沒問題。

Links booklink

Contact Us: admin [ a t ] ucptt.com