如何在SAS的DO循环中动态获取数据集的行数
在SAS里要动态获取数据集行数替代固定值,有两种常用方法,都能实现类似R中nrow()的效果:
方法1:用PROC SQL获取行数并存入宏变量
先通过PROC SQL统计数据集的行数,把结果存入一个宏变量,之后在数据步的do循环里引用这个宏变量即可:
/* 统计original_data的行数,存入宏变量dsn_rows */ proc sql noprint; select count(*) into :dsn_rows trimmed from original_data; quit; /* 在数据步中引用宏变量,实现动态循环次数 */ data original_data1; set original_data; do i = 1 to &dsn_rows.; new_val = var2 + 44; end; run;
trimmed选项用来去除宏变量值前后的空格,避免引用时出现语法错误。
方法2:用数据步的END选项和CALL SYMPUTX
通过数据步遍历数据集,当读到最后一行时,用_n_(当前观测数)获取总行数,并存入宏变量:
/* 遍历数据集,将总行数存入宏变量dsn_rows */ data _null_; set original_data end=last_row; if last_row then call symputx('dsn_rows', _n_); run; /* 同样在数据步中引用宏变量 */ data original_data1; set original_data; do i = 1 to &dsn_rows.; new_val = var2 + 44; end; run;
两种方法都能实现动态获取行数的需求,可根据习惯选择。需要注意的是,宏变量默认全局有效,只要在引用前执行获取行数的代码即可。
内容的提问来源于stack exchange,提问作者Brian Smith
相关产品推荐
相关产品推荐

