2017-05-28 137 views
0

我有这个简单的问题需要解决,我需要使用Stata来解决。我更熟悉R,所以我开始在那里解决,以确保我了解问题,然后想翻译为Stata将R for循环转换为Stata

在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' 
    } 
} 

有很难找到下一个步骤将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] 
    } 
    } 
} 

我测试(周围饰)。

回答

2

这里是Stata代码,它生成与您的R代码一样的列new1new4new5new6

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  . | 
    | .  .  .  . | 
    | .  .  .  . | 
    | .  .  .  . | 
    | .  .  .  . | 
    | .  .  .  . | 
    | .  .  .  . | 
    | .  .  .  . | 
    | .  .  .  . | 
    | .  .  .  . | 
    | .  .  .  . | 
    | .  .  .  . | 
    | .  .  .  . | 
    +---------------------------+ 

EDIT(尼克·考克斯):这似乎降低

qui foreach i in 1 4 5 6 { 
    gen new`i' = qa_`i' * qb_`i' if qc_`i' == 3 
} 
list new*, noobs sep(0) 

如在观察内环是完全没有必要,并把文成当地人只是把它拿出来再很快成为无点。

+0

用于解码原始R的信用,但这是一个非常直接的翻译。在另一个版本中,我已经自由地进行了编辑,因为代码不会作为评论而明确,并且在我将其作为另一个答案编写时没有太多意义。随意使用它,只是如果你想删除它,那么我会把它作为另一个答案。 –

+0

谢谢@NickCox的编辑!是的,我从字面上翻译了snoram的代码,因为我不知道他/她的目标。 R代码也可以缩短,但这是snoram的选择。 –

+0

这两个代码片段都证明对我非常有用 – snoram