我有一些数据从1971年到2099年。组织如下:
YEAR;MONTH;DAY;RES1;RES2
1971;1;1;1206.1;627
1971;1;2;1303.4;654.3
1971;1;3;1248.9;662
1971;1;4;1188.8;666.8
1971;1;5;1055.2;667.8
1971;1;6;987.1;663.3
1971;1;7;939.2;655.1
1971;1;8;883.2;644.4
1971;1;9;844.1;632.6
1971;1;10;813.2;620.7
1971;1;11;786.4;609
1971;1;12;765.9;598.2
1971;1;13;990.2;650.1
1971;1;14;1374.4;698.9
1971;1;15;1335.9;718
1971;1;16;1193.2;721.6
1971;1;17;1043.5;719.5
1971;1;18;995.7;710.9
1971;1;19;937.2;696.2
1971;1;20;877;678.2
1971;1;21;880.2;676.5
1971;1;22;1227.2;715.3
1971;1;23;1275.7;731.1
1971;1;24;1029.2;730.7
1971;1;25;934.2;724.9
1971;1;26;923.6;714.8
1971;1;27;887.6;700.1
1971;1;28;840.2;682.6
1971;1;29;791.7;664.3
1971;1;30;746.7;646.4
1971;1;31;706.8;629.3
使用这些数据我需要计算几个平均值,例如月平均值。为了计算月平均值,我使用了DoBy包的summaryBy函数。以下代码为我提供了月平均值:
indREF=which(data$YEAR > 1974 & data$YEAR < 2005)
indEND=which(data$YEAR > 2069)
dataREF=data[indREF,]
dataEND=data[indEND,]
MoyRef=c(summaryBy(dataREF[,"MONTH"]~MONTH, dataREF, FUN = function(x) {return(mean(x,na.rm=TRUE))})[,1])
MoyEnd=c(summaryBy(dataEND[,"MONTH"]~MONTH, dataEND, FUN = function(x) {return(mean(x,na.rm=TRUE))})[,1])
for ( i in 4:dim(data)[2])
{
MoyRef=cbind(MoyRef,summaryBy(dataREF[,i]~MONTH, dataREF, FUN = function(x) {return(mean(x,na.rm=TRUE))})[,2])
MoyEnd=cbind(MoyEnd,summaryBy(dataEND[,i]~MONTH, dataEND, FUN = function(x) {return(mean(x,na.rm=TRUE))})[,2])
}
但是现在,考虑到数据从1971年到2099年使用每日时间步长的事实,我想计算数据的日平均值,例如输出如下:
MONTH;DAY;AVERAGE_RES1;AVERAGE_RES2
01;01;VALUE1;VALUE2
01;02;VALUE3;VALUE4
...
12;31;VALUEx;VALUEx
有没有人知道如何实现这个目标?
答案 0 :(得分:2)
不幸的是,样本数据不适合测试,因为它只包含1月只有一年,因此计算方法并不多。但是,这应该做的工作:
aggregate(data[c("RES1", "RES2")], by = list(data$MONTH, data$DAY), FUN = "mean")
答案 1 :(得分:1)
我认为您应该使用dplyr
这样的
library(dplyr)
df %>% group_by(MONTH,DAY) %>% summarise_each_(funs(mean),c("RES1","RES2"))
答案 2 :(得分:1)
已经发布了一个dplyr答案,很快就会有一个data.table答案。我仍然使用aggregate()
支持我的“R without packages”答案。虽然dplyr和data.table显然有其理由,但我喜欢sqldf的想法:你学习SQL语法一次,然后可以在你的余生中使用它,而其他语言和包来来去去,SQL,就像基本的R ,留下来。因此:
library(sqldf)
sqldf("SELECT DAY, MONTH, AVG(RES1), AVG(RES2) FROM data GROUP BY MONTH, DAY")