Sas 迭代值列表

Sas 迭代值列表,sas,Sas,假设我有一个包含以下列的表:列a、列b和列c。这些列是一些计数,我想在每列中添加两个,创建新列column_a_new、column_b_new和column_c_new 如何迭代宏语句中的任意值列表?我知道,如果我有一个整数序列,比如%DoI=0%到&n…,这将很容易。我假设您想将列名加载到宏变量中,并对这些值进行迭代。如果是这样的话,在这种情况下,%scan是您的朋友 /* Assuming items are separated by a space */ %let list_to_ite

假设我有一个包含以下列的表:列a、列b和列c。这些列是一些计数,我想在每列中添加两个,创建新列column_a_new、column_b_new和column_c_new


如何迭代宏语句中的任意值列表?我知道,如果我有一个整数序列,比如%DoI=0%到&n…,这将很容易。我假设您想将列名加载到宏变量中,并对这些值进行迭代。如果是这样的话,在这种情况下,%scan是您的朋友

/* Assuming items are separated by a space */
%let list_to_iterate = %str(item1 item2 item3 item4);

%let ii = 1;
%do %while (%scan(&list_to_iterate , &ii, %str( )) NE %str());
      %let this_item = %scan(&list_to_iterate , &ii, %str( ));

      /* Do what you have to do with &this_item here */

      %let ii = %eval(&ii + 1);

%end;

然而,有更简单的方法来实现你真正描述的东西,不是吗?只需执行类似列a_new=列a+1;?由于您正在寻找基于宏的解决方案,因此可能还有更多内容。

从列表中扫描出每个“令牌”,并将其用作发出源代码(数据步骤分配语句)的基础:

%macro tweakOf(vars=);
  %local index var;
  %do index = 1 to %sysfunc(countw(&vars));
    %let var = %scan(&vars,&index);
    &var._new = &var + 2;  /* emit data step assignment statement */
  %end;
%mend;

data want;
  set have;
  %tweakOf(vars=a b c)
run;

阵列就是为此而设计的,不过您需要处理命名。有多种简单的方法可以做到这一点

data new;
   set old;

   array _input(*) column_a column_b column_c;
   array _output(*) column_a_new column_b_new column_c_new;

   do i=1 to dim(_input);
        _output(i) = input(i) + 2; *consider how missing values will be handled;
   end;
run;
要自动创建变量列表,可以使用SASHELP.VCOLUMN数据集,也可以使用PROC内容动态生成变量列表。
根据原始列表的指定方式,有许多方法可以生成末尾带有_new的列表。

请显示您对此问题的尝试。