使用索引创建标志

时间:2016-07-15 18:24:50

标签: stata

我希望为重复成绩,跳过成绩或有不同年级成绩的学生(例如2008年的4年级和2009年的7年级)制作标志。我的数据在学生id-year-subject级别是唯一的,并且结构如下(尽管有更多变量):

id    year    subject    tested_grade    
1     2011      m            10            
1     2012      m            11                  
1     2013      m            12
2     2011      r            4
2     2012      r            7
2     2013      r            8
3     2011      m            6
3     2013      m            8

这是我用过的代码:

sort id year grade
gen repeat_flag = . 
    replace repeat_flag = 1 if year!=year[_n+1] & grade==grade[_n+1] ///
        & subject!=subject[_n+1] & id==id[_n+1]
    replace repeat_flag = 0 if repeat_flag==.

一个问题是,有很多学生参加了6年级的考试,没有参加过7年级的考试,然后考上了8年级的考试。这种情况因年份和学区而异,因为某些学区在不同年级对不同年级进行了测试。我的代码没有说明这一点。

尽管我认为必须有更优雅的方法来做到这一点,并且作为旁注,我想知道索引的使用是否适合这样的问题。谢谢!

修改 包含我上面的数据样本的样本,以回应下面的评论之一。如果仍然不清楚,欢迎任何反馈。

1 个答案:

答案 0 :(得分:1)

在测试成绩中,学生的进展速度更快或更慢,而不是时间的推移,这似乎是异常的。对于笨拙的工作来说,这可能只是一行:

clear 
input id    year  str1  subject    tested_grade    
1     2011      m            10            
1     2012      m            11                  
1     2013      m            12
2     2011      r            4
2     2012      r            7
2     2013      r            8
3     2011      m            6
3     2013      m            8
end 
bysort id (year) : gen flag = (tested - tested[_n-1]) - (year - year[_n-1])  
list if flag != 0 & flag < . , sepby(id) 

     +---------------------------------------+
     | id   year   subject   tested~e   flag |
     |---------------------------------------|
  5. |  2   2012         r          7      2 |
     +---------------------------------------+