将R for循环转换为Stata
我有一个简单的问题要解决,我需要使用将R for循环转换为Stata,stata,Stata,我有一个简单的问题要解决,我需要使用Stata来解决。我对R更为熟悉,因此我从解决那里开始,以确保我理解问题,然后想翻译成Stata 类似问题的R代码 # Generate dummy data n <- 30L df <- data.frame(id = seq_len(n)) set.seed(10L) question <- c("qa", "qb", "qc") for (q in question) { for (a in 1L:6L) { df[, p
Stata
来解决。我对R
更为熟悉,因此我从解决那里开始,以确保我理解问题,然后想翻译成Stata
类似问题的R代码
# Generate dummy data
n <- 30L
df <- data.frame(id = seq_len(n))
set.seed(10L)
question <- c("qa", "qb", "qc")
for (q in question) {
for (a in 1L:6L) {
df[, paste(q, a, sep = "_")] <- sample(c(0L:10L, NA),
size = n,
replace = TRUE)
}
}
# Now based on certain "activities" generate new variables
activity <- c(1, 4, 5, 6)
for (i in activity) {
# If answer to question c for that activity is equal to 3
# then value of the new variable is a multiple of the other two
vara <- paste0("qa_", i)
varb <- paste0("qb_", i)
varc <- paste0("qc_", i)
varn <- paste0("new", i)
df[, varn] <- as.numeric(rep(NA, times = n))
for (j in seq_len(n)) {
if (is.na(df[j, varc])) {
# Do nothing
} else if (df[j, varc] == 3) {
df[j, varn] <- df[j, vara] * df[j, varb]
}
}
}
很难找到下一步。这里是生成列
new1
,new4
,new5
,new6
的Stata代码,与R代码一样
local numlist = "1 4 5 6"
local N = _N
foreach i in `numlist' {
local vara = "qa_" + "`i'"
local varb = "qb_" + "`i'"
local varc = "qc_" + "`i'"
local varn = "new" + "`i'"
qui gen `varn'=.
foreach j of numlist 1/`N' {
if (`varc'[`j']==3) {
qui replace `varn'=`vara'*`varb' in `j'
}
}
}
list new*, noobs sep(0)
+---------------------------+
| new1 new4 new5 new6 |
|---------------------------|
| . . . . |
| 3 . . . |
| . . . . |
| 40 . . 2 |
| . . . . |
| . . . . |
| . . . . |
| . 48 . . |
| . . . . |
| . . . . |
| . . . . |
| . . 0 . |
| . . . . |
| . . 8 . |
| . . . . |
| . . . . |
| . . . . |
| 9 . 20 . |
| . . . . |
| . . . . |
| . . . . |
| . . . . |
| . . . . |
| . . . . |
| . . . . |
| . . . . |
| . . . . |
| . . . . |
| . . . . |
| . . . . |
+---------------------------+
编辑(尼克·考克斯):这似乎会减少到
qui foreach i in 1 4 5 6 {
gen new`i' = qa_`i' * qb_`i' if qc_`i' == 3
}
list new*, noobs sep(0)
由于观察结果的内部循环是非常不必要的,将文本放入局部变量,然后很快将其取出是没有意义的 这里是生成列
new1
,new4
,new5
,new6
的Stata代码,与R代码一样
local numlist = "1 4 5 6"
local N = _N
foreach i in `numlist' {
local vara = "qa_" + "`i'"
local varb = "qb_" + "`i'"
local varc = "qc_" + "`i'"
local varn = "new" + "`i'"
qui gen `varn'=.
foreach j of numlist 1/`N' {
if (`varc'[`j']==3) {
qui replace `varn'=`vara'*`varb' in `j'
}
}
}
list new*, noobs sep(0)
+---------------------------+
| new1 new4 new5 new6 |
|---------------------------|
| . . . . |
| 3 . . . |
| . . . . |
| 40 . . 2 |
| . . . . |
| . . . . |
| . . . . |
| . 48 . . |
| . . . . |
| . . . . |
| . . . . |
| . . 0 . |
| . . . . |
| . . 8 . |
| . . . . |
| . . . . |
| . . . . |
| 9 . 20 . |
| . . . . |
| . . . . |
| . . . . |
| . . . . |
| . . . . |
| . . . . |
| . . . . |
| . . . . |
| . . . . |
| . . . . |
| . . . . |
| . . . . |
+---------------------------+
编辑(尼克·考克斯):这似乎会减少到
qui foreach i in 1 4 5 6 {
gen new`i' = qa_`i' * qb_`i' if qc_`i' == 3
}
list new*, noobs sep(0)
由于观察结果的内部循环是非常不必要的,将文本放入局部变量,然后很快将其取出是没有意义的 这是对原始R的解码,但这是一个非常直译。我已经自由地在另一个版本中编辑,因为代码作为一个注释并不清晰,并且作为另一个答案写它也没有多大意义。你可以随意使用它,除非你想删除它,那么我会把它作为另一个答案发布。谢谢@NickCox的编辑!是的,我逐字翻译了snoram的代码,因为我不知道他/她的目的。此外,R代码可以缩短,但这是snoram的一种选择。对原始R代码的解码值得称赞,但这是一种非常直译的翻译。我已经自由地在另一个版本中编辑,因为代码作为一个注释并不清晰,并且作为另一个答案写它也没有多大意义。你可以随意使用它,除非你想删除它,那么我会把它作为另一个答案发布。谢谢@NickCox的编辑!是的,我逐字翻译了snoram的代码,因为我不知道他/她的目的。R代码也可以缩短,但这是snoram的选择。