2016-10-28 15 views
1

Мне интересно, есть ли функция в R, как в Stata, где вы можете использовать значение наблюдений n чисел до или после каждого наблюдения. Например, если мне нужно умножить или разделить наблюдение до того, как я напишу что-то вроде этого variable_x/variable_x[_n-1]Что такое R эквивалент функции _n Stata?

+0

'variable_x/запаздывание (variable_x, 1) ' – Khashaa

+1

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

+2

Строго' _n' не является функцией вообще. Это встроенная переменная, которая является текущим номером наблюдения, текущим значением в текущем порядке сортировки набора данных. Существует дополнительный поворот в том, что под эгидой 'by' _varlist_: это определяется в текущей группе, определяемой комбинациями различных значений _varlist_. (Я не ожидаю, что это будет полностью самоочевидно для пользователей R, которые не используют Stata не более, чем краткое определение некоторого синтаксиса R, как правило, будет обратным.) –

ответ

0

В общем, вы не можете получить такую ​​же функциональность. Например, в Stata, можно перебирать с _n как ...

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. В других случаях вы можете использовать cumsum. И в других, lag (как упоминалось @ Хашаа). Эти решения охватывают большинство, но не все случаи.

Если вам действительно нужно выполнить итерацию с использованием предыдущей строки и не использовать один из этих ярлыков, вы все равно можете использовать цикл (при синтаксисе R похожи на Stata). Если цикл медленный, вы также можете записать его на C++ с пакетом Rcpp.

0

Я не совсем уверен, что означает фраза «n номеров до». Если это индекс, я, возможно, неправильно его интерпретировал. Вы можете получить последнее значение, вычисленное с полу-спрятан .Last.value переменной:

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

> 3^11 
[1] 177147 

Если вы используете индекс i для обозначения элемента, obj то, очевидно, вы можете обратиться к obj[ я-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

Самый короткий путь:

bysort Vect: ген п = _n

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

bysort Vect: ген N = _N

ave(1:length(vect), vect, FUN = length) 
Смежные вопросы