【发布时间】: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'
}
我的数据集比下面发布的示例庞大且复杂。我想主要了解涉及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)
)
主要是,在数据集中,UF、UPA 有多种可能的组合来识别个人。 Ano 和 Trimestre 表示年份和三个月。
似乎数据集仅匹配具有相同UF-UPA 的所有行,方法是根据每个组中p201 的第一个值将它们全部匹配。如果观察值与过去或未来日期的其他观察值配对,则变量 back 和 forw 等于 1。
然后我的问题是,如果有人可以帮我说出while 和j 的用途是什么?我不确定仅使用来自 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