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

如何在SAS中通过宏变量与Do Loop生成带CY前缀的新列

SAS数据集格式转换解决方案

原始数据集(表名:have)

ID      Date        Calendar_Yr 
1     07/04/2023      2023          
1     09/01/2023      2023
1     02/01/2024      2024
1     04/04/2024      2024

期望目标数据集(表名:want)

ID      Date           Calendar_Yr   
1     07/04/2023       CY 2023    
1     09/01/2023       CY 2023   
1     02/01/2024       CY 2024
1     04/04/2024       CY 2024

实现步骤

1. 提取唯一年份到宏变量

通过PROC SQL提取数据集中所有不重复的年份值,存入宏变量&year_list:

proc sql noprint;
    select distinct Calendar_Yr into :year_list separated by ' '
    from have;
quit;

/* 可选:查看宏变量内容,确认提取结果 */
%put 提取到的年份列表:&year_list;

2. 宏循环结合If/Then实现格式转换

在数据步中,用宏循环遍历宏变量中的每个年份,通过if/then语句替换Calendar_Yr的格式。先将数值型的Calendar_Yr转换为字符型,避免类型转换异常:

data want;
    set have;
    /* 定义字符型变量长度,"CY 2023"共7个字符 */
    length Calendar_Yr $7;
    /* 将原数值型变量转为字符型 */
    Calendar_Yr = put(Calendar_Yr, 4.);
    
    /* 遍历宏变量中的每个年份 */
    %do i = 1 %to %sysfunc(countw(&year_list));
        %let current_year = %scan(&year_list, &i);
        /* 匹配年份后拼接前缀"CY " */
        if Calendar_Yr = "&current_year" then Calendar_Yr = cats('CY ', &current_year);
    %end;
run;

代码说明

  • PROC SQL部分:通过distinct去重,into :year_list separated by ' '将年份以空格分隔存入宏变量,后续用countw统计年份数量、scan逐个取出年份。
  • 数据步部分:先定义变量长度并转换类型,确保字符拼接正常;宏循环遍历每个年份,通过if/then匹配后替换为目标格式。

内容的提问来源于stack exchange,提问作者B K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:45:28