You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于两个变量生成序号列?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:23:29