Sas 迭代值列表
假设我有一个包含以下列的表:列a、列b和列c。这些列是一些计数,我想在每列中添加两个,创建新列column_a_new、column_b_new和column_c_newSas 迭代值列表,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
如何迭代宏语句中的任意值列表?我知道,如果我有一个整数序列,比如%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的列表。请显示您对此问题的尝试。