根据多列中的值创建变量?
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 因此通常需要选择哪个参数在前面以及其他参数在后面。
有一个相当大的 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 因此通常需要选择哪个参数在前面以及其他参数在后面。