有一个相当大的Stata数据集(教育),其中60多个变量专用于“应试”信息,另外一些则基于学生的性别,年龄,人口统计学等。有成千上万的学生(行)。不幸的是,各种考试的成绩都不是标准的(字母和数字的组合,并且可能会出现在每个学生的60+列中的任何一列中,具体取决于他们参加相关考试的时间)。我正在尝试创建一个新变量,以标识此时所有参加G40或G41考试的部分变更的人。成绩列均被分配为dx
和一个数字,因此我首先尝试以下方法:
gen byte event = 0
replace event = 1 if dx1 == "G40" | dx1 == "G41"| dx2 == "G40" | dx2 == "G41" | dx3 == "G40" | dx3 == "G41" | dx4 == "G40" | dx4 == "G41" | dx5 == "G40" | dx5 == "G41" & age < 12
我不想每次为新考试创建新变量时都写出60多个列中的每一个。有更快的方法吗?
答案 0 :(得分:1)
我将展示两种技术,一种对您给出的较小代码示例有用,而另一种对60多个“列”(变量!)更好。
就您的示例而言,我倾向于写成一行
gen byte event = ( inlist("G40", dx1, dx2, dx3, dx4, dx5) | ///
inlist("G41", dx1, dx2, dx3, dx4, dx5) ) & age < 12
对于60多个此类变量,我会编写一个循环。
gen byte event = 0
foreach v of var dx* {
display "`v' " _c
replace event = 1 if inlist(`v', "G40", "G41") & age < 12
}
出于调试目的或仅出于理解目的,在操作看起来很常规后,输出的噪声将比常规噪声大。 inlist()
的标准技巧是要注意,形式为 foo ==
whatever 的测试与 whatever的测试相同 ==
foo ,因此通常可以选择先选择哪个参数,然后选择其他参数。