【问题标题】:Calculating the percent change between two values in R and off by one issue通过一个问题计算 R 和 off 中两个值之间的百分比变化
【发布时间】:2012-09-09 20:21:28
【问题描述】:

我正在尝试以以下形式计算 R 中两点之间的百分比变化:

(X_(i+1) - X_(i))/(X_(i))

这是我到目前为止的想法:

#x is a vector from the dataframe
#lag is distance between two points being compared
percent_change = function(x,lag = 1)
{
    n = length(x)
    pchange = c((x[(1+lag):n] - x[1:(n-lag)])/x[1:(n-lag)],NA)
    return(pchange)
}

但是,为了在 R 中完成这项任务,我必须绑定一个 NA 以避免:

Error in \`$<-.data.frame\`(\`*tmp*\`, "Change", value = c(0.00248221082243916,  : 
  replacement has 4616 rows, data has 4617

有了这个添加,操作就会发生并与我计算出来的结果对齐。

有没有一种方法可以让我不必附加 NA?

【问题讨论】:

  • 您似乎根本没有使用数据框 - 是在调用此函数的代码中吗?
  • 如果您不将其存储回数据框,那么您不需要 NA。

标签: r function


【解决方案1】:

如果您想将pc_change 结果存储回原始数据框中,您确实需要NA

由于您的数组的最后一个元素没有 x+1 可与之比较,因此会产生一个比原始向量短 1(或滞后)的向量。


警告:请注意,您添加了一个NA - 这对于lag=1 的情况是正确的,但更一般地,您需要lag × NA 元素。

尝试将NA 替换为rep(NA,lag)


这是使用内置 diff 函数的更紧凑的函数版本:

pcchange=function(x,lag=1) c(diff(x,lag),rep(NA,lag))/x

【讨论】:

  • 啊!这比我想出的要紧凑得多。一个问题:语法上可以对 c(diff(x,lag),rep(NA,lag), ..) 执行任何操作(+、-、*、%、..)吗?
  • Diff 显然是减法运算。除此之外,不,你应该像上面那样合成你自己的。您可以随时查看要区分的来源:在终端输入 diff.default
【解决方案2】:

对我来说,添加 NA 似乎是一个有效的解决方案。但是,有一些函数可以执行这种操作。查看lag 函数以获取滞后时间序列。一般来说,对于时间序列分析,请查看 xtszoo 包以处理时间序列。 CRAN TaskView dedicated to timeseries 也是一个有价值的信息来源。

【讨论】:

  • 谢谢!我一定会弄出来的。我没有意识到这些信息有如此集中的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多