如何基于两个变量生成序号列?SAS数据集处理问询
问题描述
现有SAS数据集df,数据如下:
data df; input Country $ Year; datalines; USA 2019 USA 2019 USA 2020 Canada 2019 Canada 2020 Canada 2020 ; run;
需要基于Country和Year两个变量分组生成序号列series,让每个Country+Year组合内的行按顺序生成1、2……的序号,最终输出结果如下:
Country Year series ------- ---- ------ USA 2019 1 USA 2019 2 USA 2020 1 Canada 2019 1 Canada 2020 1 Canada 2020 2
解决方案
方法1:DATA步结合BY组处理
SAS的BY组能识别分组变量的变化,搭配计数器变量即可实现分组序号生成,注意使用BY组前要先按分组变量排序:
/* 先按Country和Year排序 */ proc sort data=df; by Country Year; run; /* 生成分组序号 */ data df_with_series; set df; by Country Year; /* 每次分组(Country或Year变化)时重置计数器为1 */ if first.Year then series = 1; else series + 1; run;
first.Year是SAS自动生成的BY组变量,当Year(或前置的Country)发生变化时,该变量值为1,否则为0;series + 1是SAS累加语句,等价于series = series + 1,初始值默认为0,第一次触发if first.Year时会被设为1。
方法2:PROC SQL结合窗口函数
用ROW_NUMBER()窗口函数可以更简洁实现,无需提前排序:
proc sql; create table df_with_series as select Country, Year, row_number() over(partition by Country, Year order by Country, Year) as series from df; quit;
partition by Country, Year指定按这两个变量分组;order by Country, Year保证每组内的行顺序和原数据集一致(有其他排序需求可修改此处);row_number()会为每个分组内的行生成连续序号。
内容的提问来源于stack exchange,提问作者An116
相关产品推荐
相关产品推荐

