[问题] 将资料时间按月份计算(循环)

楼主: 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