【问题标题】:Syntactical Issue in R [closed]R中的语法问题[关闭]
【发布时间】:2013-01-06 19:34:57
【问题描述】:

我在 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

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

【问题讨论】:

  • starobs 只是一个观察点。在这种情况下 startobs=1
  • startobs+i 在某个时候将是 101。语义问题。
  • 这不是问题,我的数据集很大。 Startobs 不是问题,而是 +/-/* 。为什么 R 不让我这样做?
  • 您只能通过发布可重现的代码来说服我们。使用 dput 并定义一切。

标签: r zoo


【解决方案1】:

即使您问题中的对象不能是动物园对象,我还是用它来创建一个...并创建一个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 在执行操作之前首先按索引对齐。因此,对没有重叠索引的 zoo 对象进行操作会产生一个没有观察值的 zoo 对象,这可以通过运行一次 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)

【讨论】:

  • z$comgrowth
  • @gabriel:在您花时间创建可重现的示例之前,我不会花更多时间在这上面。我编辑了你的问题,所以data 实际上是一个动物园对象,但顺序是相反的,因为你的初始对象是反向时间顺序(这对于动物园对象来说是不可能的)。
【解决方案2】:

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

> 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”条目的起始值在序列的错误末尾。

【讨论】:

    猜你喜欢
    • 2014-11-10
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2015-08-06
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    相关资源
    最近更新 更多