【问题标题】:Create variable based on value in multiple columns?根据多列中的值创建变量?
【发布时间】:2020-06-23 04:35:21
【问题描述】:

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

【问题讨论】:

    标签: variables replace stata


    【解决方案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 所以通常会选择哪个参数在前,而其他参数在后。

    【讨论】:

      猜你喜欢
      • 2016-02-13
      • 2021-01-02
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 2021-10-15
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多