R中的句法问题

时间:2013-01-06 19:34:57

标签: r zoo

我在R中有一个动物园对象的百分比变化。我想从1或100开始复合那些百分比变化,看看我们是否有复合扩展/衰减。

Lines <- "obs     date   pctchng comgrowth  
  1   2010-10-04 NA        100
  2   2010-10-01 .15       NA
  3   2010-09-30 .14       NA
  4   2010-09-29 -.05      NA
  5   2010-09-28 -.12      NA
  6   2010-09-27 .07       NA
  7   2010-09-24 -.15      NA
  8   2010-09-23 .186      NA
  9   2010-09-22 .01       NA
  10  2010-09-21 .03       NA
  11  2010-09-20 -.03      NA"
data <- read.zoo(textConnection(Lines), header=TRUE, index=2)
startobs <- 1
for (i in 1:100) {
  data[startobs+i,"comgrowth"] <- data[startobs+i-1,"comgrowth"] *
    (1+data[startobs+i,"pctchng"])
}

我正在简化数据以简化显示,但这是我想要做的主意。我意识到问题是在加/减/除/乘时。出于某种原因,我可以说data[startobs+i,"comgrowth"]=data[startobs+i-1,"comgrowth"]但是......

我不能说data[startobs+i,"comgrowth"]=data[startobs+i-1,"comgrowth"]+data[startobs+i-2,"comgrowth"]。 R不会让我添加+ / - / *等并给我这个错误

Error in NextMethod("[<-") : replacement has length zero

这是一个完整的问题,纯粹而简单。有谁知道我做错了什么?

2 个答案:

答案 0 :(得分:5)

即使你的问题中的对象不能成为动物园对象,我也用它来创建一个......并创建一个reproducible example

library(zoo)
z <- structure(c(-0.03, 0.03, 0.01, 0.186, -0.15, 0.07, -0.12, -0.05, 
  0.14, 0.15, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 100),
  .Dim = c(11L, 2L), .Dimnames = list(NULL, c("pctchng", "comgrowth")),
  index = structure(c(14872, 14873, 14874, 14875, 14876, 14879, 14880,
  14881, 14882, 14883, 14886), class = "Date"), class = "zoo")
sobs <- 1
for (i in 1:10) {
  z[sobs+i,"comgrowth"]=z[sobs+i-1,"comgrowth"]*(1+z[sobs+i,"pctchng"])
}

错误是因为动物园对象上的Ops在执行操作之前首先按索引对齐。因此,对没有重叠索引的动物园对象的操作会产生一个没有观察的动物园对象,这可以通过运行for循环的一次迭代来轻松观察到。

i <- 1
sobs <- 1
z[sobs+i-1,"comgrowth"]*(1+z[sobs+i,"pctchng"])

答案是使用矢量化函数并避免for循环。

z <- structure(c(-0.03, 0.03, 0.01, 0.186, -0.15, 0.07, -0.12, -0.05,
  0.14, 0.15), .Dim = c(10L, 1L), .Dimnames = list(NULL, "pctchng"),
  index = structure(c(14872, 14873, 14874, 14875, 14876, 14879, 14880,
  14881, 14882, 14883), class = "Date"), class = "zoo")
z$comgrowth <- 100*cumprod(1+z$pctchng)

答案 1 :(得分:2)

除了Ops.zoo的注册问题外,您的数据布局还存在其他语义问题。在data操作后查看您的read.zoo对象:

> data
           obs pctchng comgrowth
2010-09-20  11  -0.030        NA
2010-09-21  10   0.030        NA
2010-09-22   9   0.010        NA
2010-09-23   8   0.186        NA
2010-09-24   7  -0.150        NA
2010-09-27   6   0.070        NA
2010-09-28   5  -0.120        NA
2010-09-29   4  -0.050        NA
2010-09-30   3   0.140        NA
2010-10-01   2   0.150        NA
2010-10-04   1      NA       100

日期索引颠倒了顺序,“comgrowth”条目的起始值位于序列的错误末尾。