将 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)
)
主要是,在数据集中,UF
、UPA
有多种可能的组合来识别个体。 Ano
和 Trimestre
表示年份和三个月。
似乎数据集只匹配具有相同 UF-UPA
的所有行,方法是让它们全部根据每个组中 p201
的第一个值。如果一个观测值与过去或未来某个日期的另一个观测值配对,则变量 back
和 forw
等于 1。
那么我的问题是,是否有人可以帮我说一下 while
和 j
的作用是什么?我不确定仅使用 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()
)
编辑 - 通过包含一个可重现的示例改进了问题并使我的问题更加清晰
嗨,我的问题是我必须将此 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
循环。
但是,我不确定这是否仅仅是因为我在此处发布的数据的特定子集,或者这些部分是否确实是必需的。有没有一种聪明的方法可以通过测试其他东西来找出答案?
我看不懂 Stata 代码,但从你的文字描述来看,听起来 dplyr
的一点点对你有用
library(dplyr)
start %>%
group_by(UF, UPA) %>%
mutate(
p201 = first(p201),
back = row_number()>1,
forw = row_number()<n()
)