【问题标题】:What's the R equivalent of Stata's _n function?Stata 的 _n 函数的 R 等价物是什么?
【发布时间】:2016-10-28 06:30:27
【问题描述】:

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

之前与观察结果相乘或相除

【问题讨论】:

  • variable_x/lag(variable_x, 1)
  • @Khashaa variable_x/dplyr::lag(variable_x, 1)
  • 严格来说_n 根本不是一个函数。它是一个内置变量,即当前观察数,当前含义在数据集的当前sort 顺序中。在by varlist 的支持下,还有一个额外的转折:这是在由 varlist 的不同值的组合定义的当前组内确定的。 (我不希望这对于不使用 Stata 的 R 用户来说是完全不言自明的,只是一些 R 语法的简要定义通常是相反的。)
  • 在R中,数据帧可以用1:nrow(df)索引,向量可以用seq_along(vec)索引。关于by varlist 的解释提出了与R by 函数同源的可能性,其中varlist 等效项为list(factor1, factor2, ...)。我发现 Stata 文档相当不透明,但也从 Stata 追随者那里听到了关于 R 文档的相同抱怨。两种语言需要不同的思维方式。文档中准确列出了对象的类型,但这些类型名称并不总是符合用户的天真期望。

标签: r stata lag equivalent lead


【解决方案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 的)。如果循环很慢,你也可以用 C++ 用 Rcpp 包编写。

【讨论】:

    【解决方案2】:

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

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

    如果您使用索引i 来引用一个项目obj,那么显然您可以引用obj[i-10]。有一个 embed 函数可以构造一个“移位”的列矩阵。

    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
    

    【讨论】:

      【解决方案3】:

      最短的方法是:

      按 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)
      

      按 vect:gen N=_N

      ave(1:length(vect), vect, FUN = length)
      

      【讨论】:

        猜你喜欢
        • 2012-12-27
        • 1970-01-01
        • 1970-01-01
        • 2023-01-17
        • 1970-01-01
        • 1970-01-01
        • 2018-11-13
        • 2021-02-14
        • 1970-01-01
        相关资源
        最近更新 更多