[問題] 迴圈問題(ncdf檔)

看板R_Language作者 (沒有妳的我)時間5年前 (2019/05/09 18:52), 編輯推噓2(2052)
留言54則, 2人參與, 5年前最新討論串1/1
[問題類型]: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) [軟體熟悉度]: 入門(寫過其他程式,只是對語法不熟悉) [問題敘述]: 各位大大好,小弟我目前有2個矩陣(原始為list)的數值資料,其中一個為時間的 index(第幾筆),另一個為各別分配的權重,我要做的事是將這2個矩陣的資訊套用在一筆 降雨資料(netcdf檔)上,由下圖的2個矩陣(時間index.權重)的資訊為例,也就是我要將 原始的降雨資料的第一天(筆)以第1天的降雨值(每個網格點)x0.8334249,加上第9830天的 降雨值x0.12252973來取代,以此類推。 而小弟我目前卡在不知道該怎麼把矩陣對應的關係(第1天的第1個時間index乘上第一 個權重)放入迴圈中,下面的程式碼中是以analog.indices表示時間的index,weights表 示權重,可能程式碼的邏輯非常怪異,我上網查或許用apply系列的指令較適合,但我也 較少用apply系列的指令,因此較不熟悉,還煩請大大們指點和較詳細的說明,也非常歡 迎引導式教學,謝謝。 2個矩陣以及降雨的資料放在此:http://0rz.tw/JI056 https://imgur.com/Q4rRKi9
(時間index) https://imgur.com/YJFXtr5
(權重) [程式範例]: library(ncdf4) library(data.table) memory.limit(size=50000) analog.indices <- A[[1]] analog.indices <- matrix(unlist(analog.indices), nrow=length(analog.indices), byrow=T) weights <- A[[2]] weights <- matrix(unlist(weights), nrow=length(weights), byrow=T) HIRAM_WRF_data <- nc_open("C:\\Users\\TOM\\Desktop\\R(資料庫)\\WRF(動力降尺度 資料)\\T2WHIRAM_c384_amip\\197901-200512_pr_axis_time_domain.nc") print(HIRAM_WRF_data) hiram_wrf_lon <- ncvar_get(HIRAM_WRF_data,"lon") hiram_wrf_lat <- ncvar_get(HIRAM_WRF_data,"lat") hiram_wrf_time <- ncvar_get(HIRAM_WRF_data,"time") hiram_wrf_pr <- ncvar_get(HIRAM_WRF_data,"pr") pr <- array(NA,dim=c(length(hiram_wrf_lon),length(hiram_wrf_lat),2)) for(i in analog.indices[1,i]){ for(w in weights[1,w]){ if(i==w){ pr[,,1:2] <- ncvar_get(HIRAM_WRF_data,"pr",start=c(1,1,i),count=c(41,77,1))*w } } } View(pr[,,1]) [環境敘述]: [關鍵字]: 迴圈 ncdf檔 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.160.100.204 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1557399136.A.E08.html

05/09 19:08, 5年前 , 1F
analog.indices的V1有重覆,對嗎?例如V1==10
05/09 19:08, 1F

05/09 19:11, 5年前 , 2F
另外,這用for會好寫很多。晚點再看看
05/09 19:11, 2F

05/09 19:40, 5年前 , 3F
權重表格如何和其他對應?說清楚一些
05/09 19:40, 3F

05/09 20:41, 5年前 , 4F
andrew大~對,但應該不多,analog.indices那個表格最
05/09 20:41, 4F

05/09 20:41, 5年前 , 5F
左邊那一列是原始資料的天數,右邊這兩列則是所有資料
05/09 20:41, 5F

05/09 20:41, 5年前 , 6F
裡和這天最相近的2天。
05/09 20:41, 6F

05/09 20:49, 5年前 , 7F
權重的表格是和analog.indices的表格相對應,也就是兩
05/09 20:49, 7F

05/09 20:49, 5年前 , 8F
者的[1,V1]做相乘,兩者的[1,V2]做相乘,再相加,只是
05/09 20:49, 8F

05/09 20:49, 5年前 , 9F
做相乘的時候analog.indices的[1,V1]不是取那個數字,
05/09 20:49, 9F

05/09 20:49, 5年前 , 10F
而是取那天的降雨資料出來和權重的[1,V1]這個值做相乘
05/09 20:49, 10F

05/09 20:49, 5年前 , 11F
,[1,V2]也是一樣。
05/09 20:49, 11F

05/09 21:28, 5年前 , 12F
那麼,遇到第10天時怎麼算?能把實際數字寫出來嗎?
05/09 21:28, 12F

05/09 22:15, 5年前 , 13F
一樣呀,第10天就是拿第10天的降雨值乘上權重[10,V1](0
05/09 22:15, 13F

05/09 22:15, 5年前 , 14F
.764485),加上第4407天的降雨值乘上權重[10,V2](0.20
05/09 22:15, 14F

05/09 22:15, 5年前 , 15F
3293)相加而得。
05/09 22:15, 15F

05/09 23:31, 5年前 , 16F
但有2個第10天不是嗎?有重覆要怎麼處理?
05/09 23:31, 16F

05/10 01:20, 5年前 , 17F
那是第10天被選了2次,意思是原始資料的第10天和第11
05/10 01:20, 17F

05/10 01:20, 5年前 , 18F
天很像,所以原始資料在第10天選了自己本身,在第11天
05/10 01:20, 18F

05/10 01:21, 5年前 , 19F
時也選了第10天,右邊這兩列的數字是選出跟原本資料(
05/10 01:21, 19F

05/10 01:21, 5年前 , 20F
最左列)那天最相近的2天出來,所以基本上會挑出自己
05/10 01:21, 20F

05/10 01:21, 5年前 , 21F
本身(第一列和第二列數字幾乎一樣);然而原始資料的
05/10 01:21, 21F

05/10 01:21, 5年前 , 22F
第10天(最左邊的列)是沒有重複的。
05/10 01:21, 22F

05/10 08:38, 5年前 , 23F
ok。那麼,雨量資料有9862天,但對應表格有10227列,而
05/10 08:38, 23F

05/10 08:39, 5年前 , 24F
你上述對應表格的列號就是對應第幾天。為什麼?
05/10 08:39, 24F

05/10 08:39, 5年前 , 25F
例如,對應表格第10227列的作用是什麼?
05/10 08:39, 25F

05/10 08:40, 5年前 , 26F
或是你新創出的雨量資料要有10227層?
05/10 08:40, 26F

05/10 09:06, 5年前 , 27F
是的話,參考 https://ideone.com/2S9KgX
05/10 09:06, 27F

05/10 11:11, 5年前 , 28F
表格的列號正常的話也只有9862列,後面是我新創的,忘
05/10 11:11, 28F

05/10 11:11, 5年前 , 29F
記刪掉,抱歉造成你理解上的誤會,再次感謝andrew大,c
05/10 11:11, 29F

05/10 11:11, 5年前 , 30F
ode的部分我會再好好的研究。
05/10 11:11, 30F

05/10 11:18, 5年前 , 31F
那把新array的dim改一下就可以了
05/10 11:18, 31F

05/10 13:20, 5年前 , 32F
恩恩,andrew大,想再請教你如果我每天的analog.indice
05/10 13:20, 32F

05/10 13:20, 5年前 , 33F
s和weights都有30個的話,col.names和for迴圈的部分除
05/10 13:20, 33F

05/10 13:20, 5年前 , 34F
了自己補足剩下的,該怎麼修改迴圈中$i1.$i2.$w1.$w2
05/10 13:20, 34F

05/10 13:20, 5年前 , 35F
的部分讓它自動加總30天呢??
05/10 13:20, 35F

05/10 13:36, 5年前 , 36F
最直接的想法是雙層迴圈,外面那層照舊走直的,裡面那層
05/10 13:36, 36F

05/10 13:36, 5年前 , 37F
走橫的。
05/10 13:36, 37F

05/10 13:38, 5年前 , 38F
另一種可以是把權重表格重新整理成特定順序,再利用矩陣
05/10 13:38, 38F

05/10 13:40, 5年前 , 39F
乘法做加權。速度應該會快很多但較不直觀。
05/10 13:40, 39F

05/10 15:16, 5年前 , 40F
我想到的是第一種(雙層迴圈),不知道改成這樣對不對
05/10 15:16, 40F

05/10 15:16, 5年前 , 41F
,還請andrew大指點。
05/10 15:16, 41F

05/10 15:16, 5年前 , 42F

05/10 15:19, 5年前 , 43F
不對喔。錯在w那層沒有用處,變成只是同一件事做很多次.
05/10 15:19, 43F

05/10 15:19, 5年前 , 44F
晚點我寫給你看看
05/10 15:19, 44F

05/10 15:19, 5年前 , 45F
因為不知道怎麼把$i1.$i2.$w1.$w2寫成迴圈,所以把i1.i
05/10 15:19, 45F

05/10 15:19, 5年前 , 46F
2.w1.w2全改成i和w。
05/10 15:19, 46F

05/10 16:19, 5年前 , 47F
05/10 16:19, 47F

05/10 18:04, 5年前 , 48F
原來是要改成這樣,非常感謝andrew大,最後有2個小問題
05/10 18:04, 48F

05/10 18:04, 5年前 , 49F
想請教你,一個是.[1:9862]最前面的那個.是代表前面
05/10 18:04, 49F

05/10 18:04, 5年前 , 50F
讀進來的那個csv檔嗎?!另一個是col.names如果i有1~30
05/10 18:04, 50F

05/10 18:04, 5年前 , 51F
的話是只能一個一個打(命名)嗎??
05/10 18:04, 51F

05/10 18:06, 5年前 , 52F
1. 是
05/10 18:06, 52F

05/10 18:08, 5年前 , 53F
2. 此例命名不必要,隨便取成as.character(1:30)也行
05/10 18:08, 53F

05/10 23:38, 5年前 , 54F
了解,再次感謝andrew大的解答和每次的幫助~
05/10 23:38, 54F
文章代碼(AID): #1Sr0PWu8 (R_Language)
文章代碼(AID): #1Sr0PWu8 (R_Language)