基于多个列中的值创建变量?

时间:2020-06-23 04:35:21

标签: variables replace stata

有一个相当大的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多个列中的每一个。有更快的方法吗?

1 个答案:

答案 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 ,因此通常可以选择先选择哪个参数,然后选择其他参数。