2017-05-28 7 views
0

私はこの簡単な問題を解決するために、Stataを使用して解決する必要があります。私はRをよく知っているので、問題を理解してからStataに翻訳したかったのです。R forループを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で同様の問題(で遊ん)私がテストしてみた何

# 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] 
    } 
    } 
} 

ためのRコード。

答えて

2

Rコードのように列を生成するStataコードは、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ありがとうございました!はい、私は彼/彼女の目的を知らないので、文字通りスノーラムのコードを翻訳しました。また、Rのコードを短縮することができますが、これは詮索の選択です。 –

+0

両方のコードスニペットが私にとって非常に便利です – snoram

関連する問題