4

R の 2 点間の変化率を次の形式で計算しようとしています。

(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)
}

ただし、RI でこのタスクを達成するために、NA をバインドして回避する必要がありました。

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

この追加により、操作が発生し、私が計算した紙にあるはずのものに一致します。

NA を追加する必要がない方法はありますか?

4

2 に答える 2

10

結果を元のデータ フレームNAに保存する場合は、次のものが必要です。pc_change

配列の最後の要素には比較対象がないため、元の要素x+1よりも短いベクトル 1 (またはラグ) が生成されます。


警告: 1 つ追加されていることに注意してください。NAこれは正しいケースですが、より一般的には×要素 lag=1が必要です。lagNA

に置き換えNAてみてくださいrep(NA,lag)


組み込み関数を使用した関数のよりコンパクトなバージョンを次に示しdiffます。

pcchange=function(x,lag=1) c(diff(x,lag),rep(NA,lag))/x
于 2012-09-09T20:30:23.807 に答える
1

私には、NA を追加することは有効な解決策のように思えます。ただし、この種の操作を実行する関数があります。lag遅れた時系列を取得する関数を見てください。一般に、時系列分析の場合、時系列の処理についてはxtsおよびzooパッケージを参照してください。時系列専用のCRAN TaskViewも貴重な情報源です。

于 2012-09-09T20:26:35.090 に答える