作者AndrewShi (没有你的我)
看板R_Language
标题[问题] 将资料时间按月份计算(回圈)
时间Tue Nov 13 17:47:04 2018
[问题类型]:
程式谘询(我想用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://webptt.com/cn.aspx?n=bbs/R_Language/M.1542102427.A.E65.html
1F:→ andrew43: 我觉得你的问题是你没想清楚要怎麽算,而不是R的问题。11/13 19:28
2F:→ andrew43: 要从365层分组平均成12层,你想要回圈怎麽「走」?11/13 19:32
3F:→ andrew43: 另你在判断「某一天属於哪一月」就真的不知所云...11/13 19:36
4F:→ andrew43: a<-1:5; b<-c("A","A","B","B","B"); 先练好把a按b分组11/13 19:40
5F:→ andrew43: 平均得到c(1.5,4)结果且不要用apply系列的写法11/13 19:41
6F:→ AndrewShi: 我想让365天按照日期让R来判断这是几月的资料,是一月11/13 19:45
7F:→ AndrewShi: 就加总前31天的资料,是二月的就加总第32~59天的资料,11/13 19:45
8F:→ AndrewShi: 最後加总成总共12个月。11/13 19:45
9F:→ AndrewShi: 好的,我先试试看。11/13 19:45
10F:→ andrew43: 你的算法很不方便,还要额外处理某个月是当年的第几天11/13 20:37
11F:→ andrew43: 当然这有额外的function可以处理。11/13 20:38
12F:→ andrew43: 此外,如此一来,不应该会有四层for loop。11/13 20:38
13F:→ andrew43: 我猜你把我的小问题做出来,你也就自然解决了。11/13 20:41
14F:→ AndrewShi: andrew大可以给我一点提示吗??我目前只想到,names(a)11/14 01:51
15F:→ AndrewShi: <- b,我不确定这是不是把a按b分组的意思。11/14 01:51
17F:→ AndrewShi: andrew大~你给我的这段程式码是把365天按照2018年的月11/14 12:34
18F:→ AndrewShi: 份和日数去分组,最後再从1+2+3+...365除上每个月的天11/14 12:34
19F:→ AndrewShi: 数的意思吗?!11/14 12:34
抱歉,我可能没有把想做的事说清楚,我的确是也想把天数和月份做连结,但上面的程式
码我是想让它当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
20F:→ andrew43: 对,我是这样算。 11/14 14:08
21F:→ andrew43: 你的方法也可以,但你的code我看不出来是在做这件事。 11/14 14:10
22F:→ andrew43: 先不要把for loop变动变数和原本存在的变数有一样的名字 11/14 14:33
※ 编辑: AndrewShi (110.50.156.45), 11/14/2018 15:44:44
※ 编辑: AndrewShi (110.50.156.45), 11/14/2018 15:45:44
23F:→ AndrewShi: andrew大~我稍微改了一下上面的程式码,但还是不行, 11/14 15:52
24F:→ AndrewShi: 我也觉得还是怪怪的,但不知道该怎麽改,tmonth有365 11/14 15:52
25F:→ AndrewShi: 个数字(1~12),我不知道该怎麽把都是1的那31天的降雨 11/14 15:53
26F:→ AndrewShi: 值放入同一格里。 11/14 15:53
28F:→ andrew43: tmonth <- month(time1) 和 for loop的tmonth打架 11/14 16:59
29F:→ andrew43: 泼你个冷水,你坚持四层loop的运算量实在很浪费力气 11/14 17:03
30F:→ andrew43: 另外,建议先退回到我给的例子,用你自己的方法重新写。 11/14 17:05
31F:→ andrew43: 在重写之前先用纸笔把program flow chart画出来再写 11/14 17:05
32F:→ andrew43: flow chart中要尽可能包括所有细节 11/14 17:06
33F:→ AndrewShi: andrew大~打架是指??我的最後2个回圈是在做降雨值的加 11/14 23:42
34F:→ AndrewShi: 总,能否请教andrew大我的回圈有缺或错哪些地方吗??如 11/14 23:43
35F:→ AndrewShi: 果没有错的很离谱,我想看自己能不能修改并完成它(毕 11/14 23:43
36F:→ AndrewShi: 竟是用自己的逻辑写的),至於你给我的那段程式码,我也 11/14 23:43
37F:→ AndrewShi: 只是勉强看的懂,但我还真的不知道也想不到要那样写。 11/14 23:43
38F:→ rubythinking: 对於tmonth你一开始的设定是c(1:12),结果到回圈里 11/15 00:03
39F:→ rubythinking: 面你又让他跟着你的time1做变化,这样第一个回圈是 11/15 00:03
40F:→ rubythinking: 不是可以去掉? 11/15 00:03
41F:→ rubythinking: 其实就连你的time1都是会变动的,所以前两个for回圈 11/15 00:05
42F:→ rubythinking: 根本是没意义的吧? 11/15 00:05
43F:→ andrew43: 因为你的code有很多诡异之处,我不能明白你的困难点在哪 11/15 00:57
44F:→ andrew43: 所以我才建议你先简化问题,先用例子中已知部份重写一次 11/15 00:59
45F:→ andrew43: 看看能不能让我或你自觉你的关键问题是什麽。 11/15 01:00
46F:→ andrew43: 至於你说你也会想不到原来可以有不同写法,这很正常的。 11/15 01:01
47F:→ andrew43: 不用太在意,先看懂别人的code逻辑是什麽就好。 11/15 01:02
48F:→ AndrewShi: 好的,那我明天再来好好的想,谢谢andrew大。 11/15 01:45
49F:→ andrew43: 先给你模仿你想法的一种解法。卡关时再开来看。 11/15 17:46
51F:→ andrew43: 例如 var.N 就是常见的计数器写法。 11/15 17:48
52F:→ AndrewShi: 了解,非常谢谢andrew大,我的想法的确是你後面传给我 11/22 12:31
53F:→ AndrewShi: 的这个写法,再看了你的程式码之後我有想出来要怎麽写 11/22 12:31
54F:→ AndrewShi: 了。 11/22 12:31
55F:→ AndrewShi: andrew大~想请问你确认一下这个回圈概念套用在两年或是 11/22 17:15
56F:→ AndrewShi: 多年的资料上应该也可以吧?!就是算两年(或多年)一月份 11/22 17:15
57F:→ AndrewShi: 的平均降雨值 11/22 17:15
58F:推 andrew43: 可以。分群平均时的组别有包含年和月就没问题。 11/22 20:59