对于学校作业,我需要在 SAS 宏中使用 do-loop 来转置数据。目前,每年都是我的数据集顶部的一个单独的变量。我需要年份成为数据集左侧的单个变量。
%macro school_transpose;
array enroll{13} Total_Enroll_2017-Total_Enroll_2005;
%do i=6 %to 18;
data school_enroll_transpose;
set school_enroll;
year=2004+i;
total_enroll=enroll{i};
run;
%end;
%mend;
%school_transpose;
实际上,您应该使用 Proc TRANSPOSE。
SET
语句有助于定义程序数据向量(PDV),因此,如果您想要在最左侧位置添加一个新变量,则需要在 SET 语句之前使用诸如 length
或 attrib
之类的语句来指定它.
显示的宏没有用,因为输出数据集正在替换由宏循环的早期迭代创建的同名数据集。
基于数组的转置将使用 DATA 步骤 DO 循环,并且可以在宏内部。赋值是否使用宏 %DO 循环?
您的数组语句位于 DATA 步骤之外,这是错误的。
示例:
DO 在宏内循环。年份是元数据的一部分(即变量名称的一部分),并在迭代基于数据步骤变量的数组时从变量名称中提取。
确实不需要在宏中进行此处理。
%macro ...
data want (keep=year total_enroll);
set have ;
array enroll Total_Enroll_2017-Total_Enroll_2005 ;
do idx = 1 to dim(enroll) ;
name = vname(enroll[idx]) ;
year = input (scan(name,-1,'_'),??best.) ;
total_enroll = enroll[idx] ;
if not missing(year) then output ;
end ;
end ;
%mend ;