SAS按输入顺序标记观测:60条观测分两组标A/B的实现方法
给SAS数据集前30/后30观测标记分组的解决方案
嗨,这个需求其实很容易实现!你可以借助SAS数据步里的自动变量_N_——它会自动记录当前正在处理的是第几条观测,完美匹配你的场景。下面给你两种常用的写法:
方法1:IF-THEN-ELSE语句(最直观,符合你的思路)
这就是你想到的条件判断写法,直接明了:
data new_dataset; set original_dataset; /* 把这里换成你的原始数据集名称 */ if _N_ <= 30 then group = 'A'; /* 前30条标记为'A' */ else group = 'B'; /* 后30条标记为'B' */ run;
简单解释:
_N_是SAS在数据步中自动生成的变量,从1开始逐行递增- 当处理到前30条观测时,给新变量
group赋值'A',剩下的观测自动进入else分支赋值'B'
方法2:SELECT语句(更适合未来扩展的写法)
如果以后你需要增加更多分组(比如前20、中间20、后20),用SELECT语句的可读性会更好:
data new_dataset; set original_dataset; select; when (_N_ <= 30) group = 'A'; otherwise group = 'B'; end; run;
额外扩展:适配任意行数的动态分组
如果你的数据集不一定刚好是60条,可以先统计总行数,再自动分成前后两半,这样更灵活:
/* 先统计数据集总行数,存到宏变量&total_obs里 */ proc sql noprint; select count(*) into :total_obs from original_dataset; quit; /* 根据总行数动态分组 */ data new_dataset; set original_dataset; if _N_ <= &total_obs./2 then group = 'A'; else group = 'B'; run;
内容的提问来源于stack exchange,提问作者Peetrius
相关产品推荐
相关产品推荐

