2017-04-14 40 views
1

删除缺失观察我有反复观察的数据集(例如,在5周的观察结果)移调过程,而在SAS

也有多个行每个个体(未每个人都一样)

ID val1 val2 val3 val4 val5 
1 0 0 1 1 1 
1 . . 2 2 2 
2 1 1 1 . . 
2 2 2 2 . . 
3 1 1 . . . 

步骤1 :我申请移调过程

proc transpose data=original out=tranposed; 
by ID; var val1-val&_valcount; /* in this example &_valcount = 5 */ 
run;  

ID val col1 col2 
1 val1 0 . 
1 val2 0 . 
1 val3 1 2 
1 val4 1 2 
1 val5 1 2 
2 val1 1 2 
2 val2 1 2 
2 val3 1 2 
2 val4 . . 
2 val5 . . 
3 val1 1 . 
3 val2 1 . 
3 val3 . . 
3 val4 . . 
3 val5 . . 

步骤2:nmiss()与缺失值仅

删除行
data transposed; set transposed; 
if nmiss(of _numeric_) EQ &_repeatcount then delete; 
/* in this example &_repeatcount = 2 */ 
run; 

ID val col1 col2 
1 val1 0 . 
1 val2 0 . 
1 val3 1 2 
1 val4 1 2 
1 val5 1 2 
2 val1 1 2 
2 val2 1 2 
2 val3 1 2 
3 val1 1 . 
3 val2 1 . 

由于原始数据集大,调换数据集的大小是非常大的,它需要很长的计算时间去换位数据集。

是否有任何方法来步骤1 &步骤2组合成单个步骤,如删除观测而转置数据集,以节省存储和时间?

+0

你提前知道了 “repeatcount”?每个小组都一样吗? – Tom

+0

是的,我提前知道“重复计数”。每个小组都不一样。我只知道,“最大” repeatcount – jaerung

+0

不应该有办法做到这一点使用数据集选项 - 在哪里? – Reeza

回答

0

所以如果你知道每个ID组和您想要的变量(列)的若干意见(行)的最大数量转

%let maxrows=2; 
%let maxcols=5; 
%let incols=val1-val5 ; 
%let outcols=col1-col&maxrows; 

然后你可以使用一个临时数组来存储所有的值为一个ID组,然后输出它。

data want ; 
    array storage (&maxrows,&maxcols) _temporary_; 
    do n=1 by 1 until (last.id); 
    set have; 
    by id ; 
    array inx &incols; 
    do j=1 to dim(inx); 
     storage(n,j)=inx(j); 
    end; 
    end; 
    length _name_ $32 ; 
    array out &outcols; 
    do row=1 to dim(inx); 
    _name_ = vname(inx(row)); 
    do col=1 to n; 
     out(col) = storage(col,row); 
    end; 
    if n(of out(*)) then output; 
    end; 
    keep id _name_ &outcols; 
run; 
+0

谢谢Tom!有用! :) – jaerung