问题是使用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包中找到。它计算给定月份的天数
答案 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_by
和dplyr::summarize
)是解决此问题的最佳方法。如果出现问题,您可以在summarize
中使用自定义函数。只需定义您的功能并在那里使用它。