我希望为重复成绩,跳过成绩或有不同年级成绩的学生(例如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年级的考试。这种情况因年份和学区而异,因为某些学区在不同年级对不同年级进行了测试。我的代码没有说明这一点。
尽管我认为必须有更优雅的方法来做到这一点,并且作为旁注,我想知道索引的使用是否适合这样的问题。谢谢!
修改 包含我上面的数据样本的样本,以回应下面的评论之一。如果仍然不清楚,欢迎任何反馈。
答案 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 |
+---------------------------------------+