根据多列中的值创建变量?

Create variable based on value in multiple columns?

有一个相当大的 Stata 数据集(教育),有 60 多个变量专门用于 'exam taken' 信息和一些其他基于学生性别、年龄、人口统计等的变量。有数万名学生(行)。不幸的是,各种考试的成绩并不标准(字母和数字的组合,并且可能出现在每个学生的 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 多列中的每一列。有更快的方法吗?

我将展示两种技术,一种适用于您提供的较小代码示例,另一种适用于 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 因此通常需要选择哪个参数在前面以及其他参数在后面。