每月操作时间序列,在R中以apply.monthly为单位

时间:2015-04-16 16:16:55

标签: r time-series xts

问题是使用apply.monthly或任何其他类似函数来对数据集执行每月操作。我的数据如下所示:

> minidata[1:10,]
          date Month Year TMIN
 1  1948-01-01   Jan 1948  1.1
 2  1948-01-02   Jan 1948  7.2
 3  1948-01-03   Jan 1948  5.0
 4  1948-01-04   Jan 1948  9.4
 5  1948-01-05   Jan 1948  4.4

 > tail(minidata)
     date      Month Year TMIN
 54 1948-02-23   Feb 1948  2.8
 55 1948-02-24   Feb 1948 -0.6
 56 1948-02-25   Feb 1948  1.7
 57 1948-02-26   Feb 1948  2.8
 58 1948-02-27   Feb 1948  4.4
 59 1948-02-28   Feb 1948  3.3

任务,使用我自己的函数来产生月平均值:

 mymean <- function(date){
   for (j in 1:days_in_month(date)){
     avg = (1/(days_in_month(date))
           *sum(minidata$TMIN[1:days_in_month(date)])}
   return(avg)
 }

结果必须与xts包中的R函数相同:

 dat.xts <- xts(x= minidata$TMIN,order.by = minidata$date)
 > apply.monthly(dat.xts,mean)
                [,1]
 1948-01-31 2.312903
 1948-02-28 2.082143

我的函数输出正确的值:

 > mymean(minidata$date[1])
      Jan 
 2.312903 
 > mymean(dat.xts[1])
      Jan 
 2.312903

我不介意$ apply.monthly $用手段生成一个新列,但我必须使用我自己的函数! (这是一个例子,实际上我的功能要困难得多)。

我试过了:

 > apply.monthly(dat.xts,function(dat.xts) mymean(dat.xts))
 Error in coredata.xts(x) : currently unsupported data type
 In addition: There were 50 or more warnings (use warnings() to see the first 50)

谢谢!

更新:days_in_month可以在lubridate包中找到。它计算给定月份的天数

3 个答案:

答案 0 :(得分:6)

您的功能是问题,而不是apply.monthly。我不知道days_in_month函数的定义位置,但它可能不适用于xts对象。我假设它需要一个日期时间类。

你的mymean函数引用了一个没有传递给它的对象,这不是一个好习惯,因为它使R搜索minidata

您的函数应该期望xts对象包含一个月的数据,并且只对该数据进行操作,而不是对函数范围之外的某些对象进行操作。例如:

mymean <- function(Data) {
  days <- days_in_month(index(Data)[1])
  avg <- (1/days) * sum(Data$Close)
  return(avg)
}
require(xts)
data(sample_matrix)
x <- as.xts(sample_matrix)
apply.monthly(x, mymean)

答案 1 :(得分:1)

要在数据框的组内执行操作,您可以使用dplyr包。例如,要获得每个组中的平均TMIN

library(dplyr)
summarize(group_by(minidata, Month), mean = mean(TMIN))

这通常写成:

minidata %>% group_by(Month) %>%
    summarize(mean = mean(TMIN))

答案 2 :(得分:-2)

您的功能仅适用于数据框,xts对象不同,无法按您的方式工作。这就是它给你错误的原因。

除此之外,你想用循环来做这件事。这比其他许多方式要花费更长的时间。

David的回答(使用dplyr::group_bydplyr::summarize)是解决此问题的最佳方法。如果出现问题,您可以在summarize中使用自定义函数。只需定义您的功能并在那里使用它。