【问题标题】:Translating an R for loop into Stata将 R for 循环转换为 Stata
【发布时间】:2017-05-28 18:10:23
【问题描述】:

我有一个简单的问题要解决,我需要使用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]
    }
  }
}

我在 Stata 中测试过(玩过)的东西

numlist "1 4 5 6"
global act `r(numlist)'
gen rows = _n

foreach i of global act {
   di "qa_" + `i'
   di "qb_" + `i'
   di "qc_" + `i'
   foreach j in rows {
     di `j'
   }
}

很难找到下一步。

【问题讨论】:

    标签: stata


    【解决方案1】:

    这里是生成列new1new4new5new6 的 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 的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 2016-01-26
    • 2012-10-13
    • 2015-12-03
    • 2020-06-03
    • 2021-03-12
    相关资源
    最近更新 更多