【问题标题】:Passing Stata loops onto R [closed]将Stata循环传递到R [关闭]
【发布时间】:2020-07-04 00:29:14
【问题描述】:

编辑 - 通过包含可重现的示例并更清楚地说明我的问题来改进问题

您好,我的问题是我必须将此 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'
        }

我的数据集比下面发布的示例庞大且复杂。我想主要了解涉及jwhile循环有什么用处。

这是一个玩具示例和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 循环。 但是,我不确定这是否仅仅是因为我在此处发布的数据的特定子集,或者这些部分是否确实是必要的。有没有一种聪明的方法可以通过测试其他一些东西来找出答案?

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。仅仅要求代码翻译是题外话。说出代码需要做什么,并描述您在翻译过程中遇到的具体问题。
  • 我不能完全做到这一点,因为我只有原始数据库,有和没有运行整个代码。此外,我无法将其取样并粘贴到此处
  • @MrFlick 请现在参考更新后的问题
  • @ArthurCarvalhoBrito 在minimal reproducible example 中,我们可以使用样本数据,_help:how-to-make-a-great-r-reproducible-example。您还需要专注于一个问题才能成为主题。最好在 R 中表达你想做什么并展示一些尝试,而不是等待从 Stata 到 R 的翻译。
  • @jay.sf 问题是我在 R 中生成示例时完全做到了这一点。我仍然认为 Stata 代码很重要,因为我不确定我发布的示例是否通用够了 - 我没有得到带有 j 下标和 while 循环的部分

标签: r for-loop while-loop stata


【解决方案1】:

我无法阅读 Stata 代码,但从您的文字描述中听起来,dplyr 对您有用

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

【讨论】:

  • 我一直在思考如何通过 R 中的组处理来复制 SAS,您对这个问题的回答帮助我弄清楚了。赞成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
相关资源
最近更新 更多