3

我想知道R中是否有像Stata一样的函数,您可以在每次观察之前或之后使用观察n个数字的值。例如,如果我需要乘以或除以观察,然后我会写这样的东西variable_x/variable_x[_n-1]

4

3 回答 3

1

通常,您无法获得完全相同的功能。例如,在 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(如@Khashaa 所述)。这些解决方案涵盖了大多数但不是所有情况。

如果您确实需要使用前一行进行迭代并且不能使用这些快捷方式之一,您仍然可以使用循环(R 语法类似于 Stata 的)。如果循环很慢,您也可以使用 Rcpp 包用 C++ 编写它。

于 2016-10-28T20:35:51.397 回答
0

最短的方法是:

bysort vect:gen n=_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:gen N=_N

ave(1:length(vect), vect, FUN = length)
于 2017-04-03T11:13:26.387 回答
0

我不确定“之前的 n 个数字”这个短语的实际含义。如果它是一个索引,那么我可能会错误地解释它。您可以获得使用半隐藏.Last.value变量计算的最后一个值:

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

> 3^11
[1] 177147

如果您使用索引i来引用某个项目,obj那么显然您可以引用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
于 2016-11-01T00:58:06.330 回答