我有这种数据集,这个数据集包含一些缺失值 (我用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;
希望这听起来很清楚。 任何提示? 感谢。
答案 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;