【问题标题】:SAS: passing varlist to sas macroSAS:将 varlist 传递给 sas 宏
【发布时间】:2016-04-12 22:12:38
【问题描述】:

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

我可以使用数组来处理每个 wave 的硬编码 varlist,但是我没有运气为每个 wave 创建一个可以调用的宏。问题似乎是无法传入 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;

【问题讨论】:

  • 我不明白为什么不能将 varlist 作为宏参数 %mymac(varlist=a--c) 的值传递。

标签: macros sas


【解决方案1】:

您也可以完全避免使用数组,方法是使用 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;

【讨论】:

    【解决方案2】:

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

    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;
    

    【讨论】:

    • 好答案。也就是说,当我想使用二维数组时,我经常意识到我最好转置数据。因此,如果第 1 波和第 2 波的 3 个变量相同,则从具有六个变量的三行更改为具有四个变量(波、a、b、c)的六行。只是一个想法。
    • 我喜欢二维数组,但变量的数量可能会因波而略有不同,我可以想象纵向研究的差异更大。
    【解决方案3】:

    试试

    wave1count = nmiss(of a--c);
    wave2count = nmiss(of d--f);
    

    【讨论】:

    • 可能值得指出的是,这将计算所有个缺失值,而不仅仅是.w。我怀疑在这种情况下数组已经是最好的选择了。
    • 是的,missing() 和 Nmiss() 对 SAS 中的 28 个缺失代码不敏感。在这种情况下 。表示项目无响应,.S 表示由于跳过-n-填充而导致的结构缺失,.w 表示波形缺失。这些差异可以在插补过程中处理,但我需要为缺失值创建标记,因为一些后续分析可能会将数据堆积起来并移除缺失值(例如,危险模型)
    • 如果它是 wave 丢失的标志,那么它并不是真正的响应者级别字段。它实际上是关于调查的元数据。
    • 我创建的变量将是波形丢失的标志。每个变量中缺少的代码是 .w 与 .因为这就是数据所有者创建密码本和输入数据的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多