【问题标题】:Differences of values based on mean months and rolling data基于平均月数和滚动数据的值差异
【发布时间】:2012-02-14 07:01:24
【问题描述】:

我正在尝试做一些看似简单但有点挑战的事情,所以我希望有人能提供帮助!
我有一个时间序列的温度观察:

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

这只是一个示例 -- 我的数据是多年的,因此我可以计算数据的完整月平均值。
然后我想要做的是计算所有一月(单独)与我上面计算的平均一月的差异。

如果我不再使用日期/时间类,我可以通过一些循环来做到这一点,但我想看看在 R 中是否有一种“简洁”的方式来做到这一点?有什么想法吗?

【问题讨论】:

  • 我稍微清理了您的代码,但无法理解您所说的 mean.ts 是什么(即值刚刚超过 1)。
  • 一个小提示。从 2.14 开始,read.table 有一个 text 参数。
  • 您也可以使用as.POSIXlt(DF[["Date"]])$mon,尽管format 仍然更容易 IMO。

标签: r date mean rolling-computation


【解决方案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,这是正确答案,因为每个月只有一个值。

【讨论】:

  • 谢谢!这正是我所追求的!
【解决方案2】:

您可以将年份添加为聚合变量。这使用公式界面更容易:

> 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2019-12-16
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多