SAS:如何在宏中使用do-loop来转置数据?

问题描述 投票:0回答:1

对于学校作业,我需要在 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;
sas macros transpose do-loops
1个回答
0
投票

实际上,您应该使用 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 ;

© www.soinside.com 2019 - 2024. All rights reserved.