(对原始问题的回答)
我从来没有使用过 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 中的本机“程序”命令不适合这类问题,因为它不能将变量作为输入/输出。” 这种猜测是完全错误的。您也可以编写一个程序来执行此操作。这个例子是示意性的,不是确定的。一个真正的程序会包括更多的检查和错误信息来匹配任何不正确的输入。有关详细的建议,您确实需要阅读文档。即使是编写简单的 Stata 程序,关于 SO 的一个答案也无法教给您所有您需要知道的知识。在任何情况下,该示例显然是轻率和/或不完整的,因此完整的工作示例将毫无意义或不可能。
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 中,命令和功能是不同的;“功能”不是命令的同义词。
第二个脚注:签出recode
。这可能是您需要的,但最好将整数代码映射到其他整数代码。
第三个脚注:需要检查的一个例子是参数generate()
应该是合法的和新的变量名。