将 Stata 循环传递给 R

Passing Stata loops onto R

编辑 - 通过包含一个可重现的示例改进了问题并使我的问题更加清晰

嗨,我的问题是我必须将此 Stata 代码转换为 R 才能在大型数据集中使用:

sort UF UPA Ano Trimestre
            loc j = 1
            loc stop = 0 
            loc count = 0
            while `stop' == 0 {
                loc lastcount = `count'
                count if p201 == . & n_p == `i'+1 
                loc count = r(N)
                if `count' == `lastcount' {
                    loc stop = 1
                }
                else {
                    if r(N) != 0 {
                        replace p201 = p201[_n - `j'] if
        UF == UF[_n - `j'] &
        UPA == UPA[_n - `j'] &
        n_p == `i'+1 & n_p[_n - `j'] == `i' & 
        p201 ==. & forw[_n - `j'] != 1 &
        replace forw = 1 if UF == UF[_n + `j'] &
        UPA == UPA[_n + `j'] &
        p201 == p201[_n + `j'] &
        n_p == `i' & n_p[_n + `j']==`i'+ 1 &
        forw != 1
        loc j = `j' + 1
                    }
                    else {
                        loc stop = 1
                    }
                }
            }
            replace back = p201 !=. if n_p == `i'+1
            replace forw = 0 if forw != 1 & n_p == `i'
        }

我的数据集比下面发布的示例庞大且复杂。我想主要了解涉及 j.

while 循环的用处是什么

这是一个玩具示例和 R 中的预期结果:

start <- data.frame(
  Ano = c(2012, 2012, 2012, 2012),
  Trimestre = c("1", "2", "3", "4"),
  UF = c(28, 28, 28, 28),
  UPA = c(280020150, 280020150, 280020150, 280020150),
  n_p = c(1, 2, 3, 4),
  p201 = c(1, NA, NA, NA),
  back = c(NA, NA, NA, NA),
  forw = c(NA, NA, NA, NA)
)

end <- data.frame(
  Ano = c(2012, 2012, 2012, 2012),
  Trimestre = c("1", "2", "3", "4"),
  UF = c(28, 28, 28, 28),
  UPA = c(280020150, 280020150, 280020150, 280020150),
  n_p = c(1, 2, 3, 4),
  p201 = c(1, 1, 1, 1),
  back = c(NA, 1, 1, 1),
  forw = c(1, 1, 1, 0)
)

主要是,在数据集中,UFUPA有多种可能的组合来识别个体。 AnoTrimestre 表示年份和三个月。

似乎数据集只匹配具有相同 UF-UPA 的所有行,方法是让它们全部根据每个组中 p201 的第一个值。如果一个观测值与过去或未来某个日期的另一个观测值配对,则变量 backforw 等于 1。

那么我的问题是,是否有人可以帮我说一下 whilej 的作用是什么?我不确定仅使用 dplyr 中的 group_by 是否可以在 R 中大大简化代码。我不确定是否需要 for 循环。 但是,我不确定这是否仅仅是因为我在此处发布的数据的特定子集,或者这些部分是否确实是必需的。有没有一种聪明的方法可以通过测试其他东西来找出答案?

我看不懂 Stata 代码,但从你的文字描述来看,听起来 dplyr 的一点点对你有用

library(dplyr)
start %>% 
  group_by(UF, UPA) %>% 
  mutate(
    p201 = first(p201),
    back = row_number()>1,
    forw = row_number()<n()
  )