如何在SAS EG中创建符合学期与课程号条件的0-1标记变量?
在SAS EG中实现课程重复标记需求
需求回顾
- 学期编码规则:
201801代表2018春季,201870代表2018秋季,需按**学期+课程号(CNUM)**维度判断重复 - 标记规则:
- CNUM为空白值→标记
1 - 同一学期内CNUM首次出现→标记
1 - 同一学期内CNUM重复出现→标记
0
- CNUM为空白值→标记
- 数据已按升序排序,同一CNUM可出现在不同学期
实现方案
方法1:DATA步(BY组处理,推荐)
利用SAS的BY组自动生成的FIRST.变量,高效处理已排序的数据:
/* 替换course_data为你的实际数据集名,TERM为学期列名,CNUM为课程号列名 */ DATA course_marked; SET course_data; BY TERM CNUM; /* 生成标记列FLAG */ IF CNUM = '' THEN FLAG = 1; ELSE IF FIRST.CNUM THEN FLAG = 1; ELSE FLAG = 0; RUN;
说明:因为数据已按升序排序,BY TERM CNUM会让SAS自动识别每组的首行,FIRST.CNUM=1表示当前行是同一学期内该课程号的首次出现。
方法2:PROC SQL(窗口函数实现)
用窗口函数ROW_NUMBER()对每组数据编号,判断是否为组内首行:
PROC SQL; CREATE TABLE course_marked AS SELECT *, CASE WHEN CNUM = '' THEN 1 WHEN ROW_NUMBER() OVER (PARTITION BY TERM, CNUM ORDER BY TERM, CNUM) = 1 THEN 1 ELSE 0 END AS FLAG FROM course_data; /* 替换为你的实际数据集名 */ QUIT;
说明:PARTITION BY TERM, CNUM按学期和课程号分组,ROW_NUMBER()给每组内的行依次编号,编号为1的行即为该组首行(首次出现)。
SAS EG操作步骤
- 打开SAS EG,连接到你的数据源,确认目标数据集已加载
- 新建「程序」节点,粘贴上述任意一段代码,修改数据集名和列名匹配你的实际数据
- 运行程序,生成的
course_marked数据集即为包含标记列的结果集
内容的提问来源于stack exchange,提问作者Elizabeth
相关产品推荐
相关产品推荐

