(元の質問への回答)
私はSASを使ったことはありませんが、大まかな推測では、次のようなものが必要です
foreach v in A B C D {
gen test`v' = 0.5 * (`v' == 1) + 0.6 * (`v' == 2) + 0.7 * (`v' == 3)
}
また
foreach v in A B C D {
gen test`v' = cond(`v' == 1, 0.5, cond(`v' == 2, 0.6, cond(`v' == 3, 0.7, .)))
}
しかし、待ってください。その中間線も次のように見えます
gen test`v' = (4 + `v') / 10
(完全に異なる改訂された質問への回答)
これは、さまざまな方法で行うことができます。上記のように、ループを持つことができます
foreach v in A B C D {
gen test`v' = 0.5 * `v' if `v' == 1
replace test`v' = 31 - `v' if `v' == 2
replace test`v' = `v' - 2 if `v' == 3
}
質問には、「入力/出力として変数を使用できないため、Stata のネイティブの「プログラム」コマンドはこの種の問題には適していないと思います」と書かれています。その推測は完全に間違っています。これを行うプログラムを作成することもできます。この例は概略的なものであり、決定的なものではありません。実際のプログラムには、誤った入力に対応するために、より多くのチェックとエラー メッセージが含まれます。詳細なアドバイスについては、ドキュメントを読む必要があります。SO に関する 1 つの回答では、単純な Stata プログラムを作成するために知っておく必要があることをすべて教えることはできません。いずれにせよ、この例は明らかにつまらない、または不完全であるため、完全に機能する例は無意味または不可能です。
program myweirdexample
version 13
syntax varlist(numeric), Generate(namelist)
local nold : word count `varlist'
local nnew : word count `generate'
if `nold' != `nnew' {
di as err "`generate' does not match `varlist'"
exit 198
}
local i = 1
quietly foreach v of local varlist {
local new : word `i' of `generate'
gen `new' = 0.5 * `v' if `v' == 1
replace `new' = 31 - `v' if `v' == 2
replace `new' = `v' - 2 if `v' == 3
local ++i
}
end
用語に関する脚注: この質問では、関数という用語を、Stata で使用されているよりも広く使用しています。Stata では、コマンドと関数は区別されます。「関数」はコマンドの同義語ではありません。
2 番目の脚注: を確認してくださいrecode
。必要なものかもしれませんが、整数コードを他の整数コードにマッピングするのに最適です。
3 番目の脚注: 必要なチェックの例は、 の引数generate()
が有効で新しい変数名であることです。