我正在尝试做一些看似简单的事情,但事实证明这是一个挑战,所以我希望有人可以提供帮助! 我有一系列时间观察温度:
Lines <-"1971-01-17 298.9197
1971-01-17 298.9197
1971-02-16 299.0429
1971-03-17 299.0753
1971-04-17 299.3250
1971-05-17 299.5606
1971-06-17 299.2380
2010-07-14 298.7876
2010-08-14 298.5529
2010-09-14 298.3642
2010-10-14 297.8739
2010-11-14 297.7455
2010-12-14 297.4790"
DF <- read.table(textConnection(Lines), col.names = c("Date", "Value"))
DF$Date <- as.Date(DF$Date)
mean.ts <- aggregate(DF["Value"], format(DF["Date"], "%m"), mean)
这会产生:
> mean.ts
Date Value
1 01 1.251667
2 02 1.263333
这只是一个例子 - 我的数据已经很多年了,所以我可以计算每月数据的完整平均值 我当时想要做的是计算所有1月份(单独)的差异与我上面计算的1月份的平均值。
如果我不再使用日期/时间类,我可以用一些循环来做这个但是我想知道在R中是否有一个“整洁”的方法来做到这一点?有什么想法吗?
答案 0 :(得分:1)
您只需将年份添加为汇总变量即可。使用公式界面更容易:
> aggregate(Value~format(Date,"%m")+format(Date,"%Y"),data=DF,mean)
format(Date, "%m") format(Date, "%Y") Value
1 01 1971 298.9197
2 02 1971 299.0429
3 03 1971 299.0753
4 04 1971 299.3250
5 05 1971 299.5606
6 06 1971 299.2380
7 07 2010 298.7876
8 08 2010 298.5529
9 09 2010 298.3642
10 10 2010 297.8739
11 11 2010 297.7455
12 12 2010 297.4790
答案 1 :(得分:1)
至少在我理解你的问题时,你想要每个月的差异与那些月份的平均值,所以你可能想要使用ave
而不是聚合:
diff.mean.ts <- ave(DF[["Value"]],
list(format(DF[["Date"]], "%m")), FUN=function(x) x-mean(x) )
如果您想在同一个数据框中使用它,那么只需将其指定为一列:
DF$ diff.mean.ts <- diff.mean.ts
ave
函数用于向现有数据帧添加列,因为它返回的长度与第一个参数中的值数相同,在本例中为DF [[“Value”]]。在当前实例中,它返回所有0,这是正确的答案,因为每个月只有一个值。