我怎么能为此处理迭代命名系统?

时间:2014-11-27 11:50:54

标签: format sas naming

我有这种数据集,这个数据集包含一些缺失值 (我用X代表他们)。

ID  VA  VB  ... Vn      |       ID  VA  VB  ... Vn  |   
1   a1  b1  ... n1      |       1   a1  X   ... n1  |
2   a2  b2  ... n2      |===    2   X   b2  ... X   |
3   a3  b3  ... n3      |===    3   a3  b3  ... n3  |
..................      |       ..................  |
N   aN  bN  ... nN      |       N   X   bN  ... nN  |

我想只使用一个变量列按ID添加观察,我会调用 变量VAR:类似于ID的反转过程格式; var VAR;。

ID  VAR
1   a1
..
1   n1 
2   b2
..
3   a3
3   b3
..
3   n3
..
N   bN
..  
N   nN

所以我尝试在不同的数据集中分割OLDdataset(NEWa NEWb ... NEWn),其中, 在每个数据集中,我们将所有未丢失的观察值存储在一个名为的列中 VAR。 然后我将在NEWdataset合并NEWa NEWb ... NEWn,我将应用proc排序 按ID恢复订单。

当我意识到" n"在分析之前不知道因为我 想要设置一个不仅适用于一个数据集的通用代码,以及VA VB VN 是proc格式步骤的结果。

如果n知道我会使用这样的东西:

data NEWa NEWb NEWc;
set OLDdataset;
array try[3] VA VB VC ;
if try[1] ne '.' then output NEWa;
if try[1] ne '.' then output NEWb;
if try[1] ne '.' then output NEWc;
run;

但现在我需要一些迭代命名系统,可能听起来像:

data NEW_i;                     <-------- "i" must be assigned
set OLDdataset;
array try[*] V: ;
do i=1 dim(try);
if try[i] ne '.' then output NEW_i; <---- "i" must be assigned
run;

希望这听起来很清楚。 任何提示? 感谢。

2 个答案:

答案 0 :(得分:0)

如果我正确理解了方案,那么您正在处理数字变量,因此在此基础上您可能不一定要按变量将数据拆分为不同的数据集,因为您应该能够使用nmiss()函数返回缺失数值的数量,例如在子集中if:

data newdataset;
  set olddataset;
  if nmiss(&varlist)=0;
run;

在上面的数据步骤中使用olddataset之前可以创建&varlist(正如你所说的变量数量可以是动态的)使用:

/* note literals are case sensitive */
proc sql noprint;
  select name into :varlist separated by ','
  from dictionary.columns
  where libname='WORK'
    and memname='OLDDATASET'
    /* use following if you also have non-numeric variables */
    /* and type='num' */
  ;
quit;

您可以使用以下内容查看&varlist的内容:

%put varlist=&varlist;

甚至在引用宏变量之前使用以下选项:

options symbolgen;

答案 1 :(得分:0)

尝试使用proc转置,您可以在第二步中删除缺失的内容,或者在out数据集中添加where子句。如果要在基于ID之后创建子集,请在数据步骤中将它们分开。

*generate sample data;
data have;
array V(20) v1-v20;
do ID=1 to 10;
    do i=1 to 20;
    v(i)=rand('normal', 0, 1);
    if v(i) < -2 then v(i)=.;
    end;
    output;
end;
drop i;
run;

*Flip data;
proc transpose data=have out=want(where=(var1 ne .)) prefix=Var;
    by id;
run;

*Separate into different data sets;
data _null_;
    set want;
    by id;
    call execute(catt("data var", id, "; set want; where id=", id, ";run;"));
run;