2016-10-28 8 views
1

StataのようなRの関数があるかどうかは、各観測の前または後に観測nの値を使用できるかどうか疑問です。たとえば、私がこのようなことを書く前に、掛け算や分割をする必要がある場合variable_x/variable_x[_n-1]Stataの_n関数に相当するRは何ですか?

+0

'variable_x /ラグ(variable_x、 1) ' – Khashaa

+1

@Khashaa variable_x/dplyr :: lag(variable_x、1)' – Gregor

+2

厳密に '_n'は関数ではありません。これは現在の観測番号であり、データセットの現在の 'ソート(sort) '順序の現在の意味であるビルトイン変数です。 _varlist_の統制の下では、_varlist_の別個の値の組み合わせによって定義された現在のグループ内で決定されることに特別な歪みがあります。 (私はこれがStataを使っていないRユーザに対して、R構文の簡単な定義よりも一般的に逆になるとは思っていません) –

答えて

0

一般に、全く同じ機能を得ることはできません。例えば、Stataの中で、あなたは

clear 
set obs 5 
gen x = 1 
replace x = x[ _n - 1 ]*1.1 if _n > 1 
list 

    +--------+ 
    |  x | 
    |--------| 
    1. |  1 | 
    2. | 1.1 | 
    3. | 1.21 | 
    4. | 1.331 | 
    5. | 1.4641 | 
    +--------+ 

Rでは、あなたはcumprod機能を備えたこのケースを扱うことができる... _n等を繰り返すかもしれません。それ以外の場合は、cumsumを使用できます。そして、他のものでは、lag(@Khashaaによると)。これらのソリューションは、すべてではありませんが、大部分をカバーします。

前の行を使用して実際に反復処理を行う必要があり、これらのショートカットを使用できない場合は、ループを使用できます(R構文はStataに似ています)。ループが遅い場合は、Rcppパッケージを使用してC++で記述することもできます。

0

実際には「n個前の数字」というフレーズが正確にはわかりません。インデックスの場合は、誤って解釈している可能性があります。あなたは半隠さ.Last.value変数で計算された最後の値を取得できます。

> for(i in 1:10) x <- x*.Last.value 
> x 
[1] 177147 

> 3^11 
[1] 177147 

アイテムを参照するためのインデックスiobjを使用している場合、明らかにあなたはobj[ I-10 ]を参照することができます。 「シフトされた」列の行列を構築する埋め込み関数があります。

x <- 1:10 
embed (x, 3) 
    [,1] [,2] [,3] 
[1,] 3 2 1 
[2,] 4 3 2 
[3,] 5 4 3 
[4,] 6 5 4 
[5,] 7 6 5 
[6,] 8 7 6 
[7,] 9 8 7 
[8,] 10 9 8 
0

最短の方法がある:

VECT bysort:GEN N = _n VECT bysort

vect=c(1,1,1,2,2,2,2,3,3,3,3,3,4) 
n=ave(1:length(vect), vect, FUN = seq_along) 

:GEN N = _N

ave(1:length(vect), vect, FUN = length) 
関連する問題