编辑:谢谢乔的建议,我会把我的问题说得更具体。实际上,我需要在Stata中编写一个函数,其中变量A,B,C,D,.作为输入,变量Y作为输出,可以用通常的Stata函数/命令来计算,例如"generate dummy=2*myfun(X) if .“
函数本身包含数值计算。伪Stata代码看起来像
myfun(X)
gen Y=0.5*X if X==1
replace Y=31-X if X==2
replace Y=X-2 if X==3
.... a long list
return(Y)
请注意,X可以是一组不同的Stata变量,数值计算在函数中是相当长的。这就是为什么我想用一个函数。我猜Stata中的本机"program“命令不适合这种类型的问题,因为它不能将变量作为输入/输出。
发布于 2013-08-06 17:42:03
(回答原问题)
我从来没有用过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程序。无论如何,这个例子显然是琐碎的和/或不完整的,所以一个完整的工作例子是没有意义的或不可能的。
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()
的参数应该是合法和新的变量名。
https://stackoverflow.com/questions/18085516
复制相似问题