Macros SAS:将varlist传递给SAS宏

Macros SAS:将varlist传递给SAS宏,macros,sas,Macros,Sas,除了SUM之外,SAS确实缺少行函数。我想计算纵向数据集中波形中的某些扩展缺失代码 我可以使用数组为每个波形处理硬编码的varlist,但我没有幸为每个波形创建一个可以调用的宏。问题似乎是无法在varlist中传递,尤其是使用first-last表示法时 data xxx; input a b c d e f; datalines; 1 2 3 4 5 6 .w .w .w .w .w .w 3 4 5 .w .w .w ; run; data yyy(

除了SUM之外,SAS确实缺少行函数。我想计算纵向数据集中波形中的某些扩展缺失代码

我可以使用数组为每个波形处理硬编码的varlist,但我没有幸为每个波形创建一个可以调用的宏。问题似乎是无法在varlist中传递,尤其是使用first-last表示法时

data xxx;
   input a b c d e f;
   datalines;
 1  2  3  4  5  6
.w .w .w .w .w .w
 3  4  5 .w .w .w
    ;
 run;

data yyy(drop=i); set xxx;    
  array wave1vars(*) a--c;
  wave1count = 0;
  do i = 1 to dim(wave1vars);
     if wave1vars(i) = .w then wave1count = wave1count +1;
  end;

  array wave2vars(*) d--f;
  wave2count = 0;
  do i = 1 to dim(wave2vars);
     if wave2vars(i) = .w then wave2count = wave2count +1;
  end;
run;
试一试


为什么需要宏?为什么不直接使用多维数组呢。除非每波中的问题数量不同

missing w;
data have;
  input a b c d e f;
cards;
 1  2  3  4  5  6
 w  w  w  w  w  w
 3  4  5  w  w  w
;;;;

data want ;
  set have ;
  array wavevars (2,3) a--c d--f ;
  array wavecount (2) ;
  do i=1 to dim(wavecount);
    wavecount(i)=0;
    do j=1 to dim2(wavevars);
      wavecount(i)+.w = wavevars(i,j);
    end;
  end;
  drop i j ;
run;

您还可以完全避免使用数组,方法是使用CATT()函数将值转换为串联字符串,然后计算在字符串中找到的W的数量,如:

343  data want;
344    input a b c d e f;
345    wave1count=countc(catt(of a--c),'W');
346    wave2count=countc(catt(of d--f),'W');
347    put _all_;
348  datalines;

a=1 b=2 c=3 d=4 e=5 f=6 wave1count=0 wave2count=0 _ERROR_=0 _N_=1
a=W b=W c=W d=W e=W f=W wave1count=3 wave2count=3 _ERROR_=0 _N_=2
a=3 b=4 c=5 d=W e=W f=W wave1count=0 wave2count=3 _ERROR_=0 _N_=3
NOTE: The data set WORK.WANT has 3 observations and 8 variables.

352  ;
353  run;

可能值得指出的是,这将计算所有缺少的值,而不仅仅是
.w
。我怀疑阵列已经是这种情况下的最佳选择。是的,missing()和Nmiss()对SAS中的28个缺失代码不敏感。在这种情况下。表示项目无响应,.S表示由于漏填导致的结构缺失,.w表示波浪缺失。这些差异可以在插补过程中处理,但我需要为波缺失创建标志,因为一些后续分析可能会将数据堆叠起来并删除波缺失(例如,危险模型),如果它是波缺失的标志,那么它实际上不是响应者级别字段。这实际上是关于调查的元数据。我创建的变量将是wave missing的标志。每个变量中缺少的代码是.w vs。因为这就是数据所有者创建代码本和输入数据的方式。我不明白为什么不能传递varlist,因为宏参数%mymac(varlist=a--c)的值可以正常工作。回答得好。也就是说,当我尝试使用二维数组时,我经常意识到最好是转置数据。因此,如果wave 1和wave 2的3个变量相同,则从三行六个变量更改为六行四个变量(wave、a、b、c)。只是一个想法。我喜欢二维数组,但变量的数量在不同的波之间可能略有不同,我可以想象纵向研究中差异更大的地方。
343  data want;
344    input a b c d e f;
345    wave1count=countc(catt(of a--c),'W');
346    wave2count=countc(catt(of d--f),'W');
347    put _all_;
348  datalines;

a=1 b=2 c=3 d=4 e=5 f=6 wave1count=0 wave2count=0 _ERROR_=0 _N_=1
a=W b=W c=W d=W e=W f=W wave1count=3 wave2count=3 _ERROR_=0 _N_=2
a=3 b=4 c=5 d=W e=W f=W wave1count=0 wave2count=3 _ERROR_=0 _N_=3
NOTE: The data set WORK.WANT has 3 observations and 8 variables.

352  ;
353  run;