将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的选择。