xts :: apply出错:“coredata.xts(x)出错:当前不支持的数据类型”

时间:2015-04-16 11:56:02

标签: r apply xts

我遇到错误当我尝试做以下工作时:

# generate random integrals #
data <- xts(floor(runif(100, 1,101)),as.Date("1973-02-01") + c(1:100) - 1)
apply.monthly(data, diff,1,1)

,虽然这个有效:

apply.monthly(data,mean)

我已经检查了类似的问题,但似乎它们不适用于此处的情况。

有什么建议吗?


进一步说明:

我需要这个的原因是我得到了如下的时间序列数据集,

1990-05 100
1990-04 80
1990-03 60
1990-02 20
1990-01 5
1989-12 110
1989-11 89
1989-10 78
...

每年y(t)=y_(t-1)+dy,其中dt是期​​间t的价值变化。但这种模式只发生在每年和每年分开。所以基本上,我想检索每个特定年份每个月之间的差异,即:

1990-05 20  #100-80
1990-04 20  #80-60
1990-03 40  #60-20
1990-02 15  #20-5
1990-01 5   #5
1989-12 21  #110-89
1989-11 11  #89-78  
...

希望我已经说清楚了。

谢谢,

1 个答案:

答案 0 :(得分:4)

apply.monthlyperiod.apply用于将数据汇总到指定的时间段。 diff不起作用,因为diff.xts返回与输入长度相同的向量。 mean有效,因为它为给定的输入向量返回一个值。

我不清楚你期望apply.monthly(data, diff)做什么。这与调用diff(data)然后将NA添加到每个月的第一个值相同。


通过编辑,我现在明白你要做什么了。你想要差异,但你希望每年的1月份是那个月的水平,而不是与去年12月的差异。

这是一种方法:

# Load your data as an example
Lines <- 
"1990-05 100
1990-04 80
1990-03 60
1990-02 20
1990-01 5
1989-12 110
1989-11 89
1989-10 78"
con <- textConnection(Lines)
# Ensure the timezone of your non-intraday xts object is UTC,
# or bad things can happen
x <- as.xts(read.zoo(con, FUN=as.yearmon), tzone="UTC")
close(con)

# Create a helper function
f <- function(x) {
  y <- diff(x)
  if (.indexmon(y)[1] == 0)
    y[1] <- x[1]
  y
}
# apply the function to each year subset and rbind the results
do.call(rbind, lapply(split(x,'years'), f))

这是另一种方式,你可能会觉得更有吸引力。

colnames(x) <- "level"
# calculate all differences
x$diff <- diff(x$level)
# set January differences to their respective level
jan <- .indexmon(x) == 0
x[jan, "diff"] <- x[jan, "level"]