2016-06-07 127 views
0

在我的sas数据集中有一些组,即id,我希望删除某些变量中缺少值的组。SAS如果缺少观察值,则删除组

比如我有这样的SAS数据集:

data have; 
    input v1 v2 v3 id; 
datalines; 
9 7 210 1 
0 6 . 1 
9 3 320 2 
6 1 . 1 
9 4 432 2 
; 
run; 

我尝试这样做:

/*Order by id*/ 
proc sort data=have; 
    by id; 
run; 

/*Select no missing observations by id*/ 
data=want; 
set=have; 
if cmiss(of _all_) then delete; 
run; 

但是这个代码不排除ID的缺失值。它删除缺少的值。

+0

给定输入的结果是什么?如果我遵循你的逻辑,两个id将被删除,因为第2行和第4行缺少值。 – Tom

回答

1

嗯。您可以使用proc sql此:

proc sql; 
    delete from have 
    where exists (select 1 from have have2 where have.id = have2.id and (have2.v1 is null or have2.v2 is null or have2.v3 is null); 
0

你只是不希望有您的结果数据集缺少的列线。那么,为什么删除,写结果,数据集时,只是排除它们或覆盖源数据集:

data have;/*overwriting my have dataset instead of deleting lines*/ 
set have; 
if not cmiss(of _ALL_); 
run; 

当要删除所有行一组,如果只有一个行有缺失值,你可以做到这一点,商店一个ID,如果它没有值,然后不写任何具有该ID的行,并且你只是得到你想要的ID行作为结果。重要的是,在缺失值的ID是首先在数据集中,但应该是因为PROC排序的那样:

data want; 
retain x; 
set have; 
if cmiss(of _ALL_) then 
x= id; 
if x ne id; 
run; 
1

一个想法可能是使用了双DOW循环。首先检查是否有缺失值,然后是第二个输出没有缺失值的ids记录。

data have; 
    input v1 v2 v3 id; 
datalines; 
9 7 210 1 
0 6 . 1 
9 3 320 2 
6 1 . 1 
9 4 432 2 
1 2 333 3 
; 

您将需要按照您的示例进行排序。

data want ; 
    do until (last.id); 
    set have; 
    by id; 
    anymissing=max(anymissing,cmiss(of v1-v3)); 
    end; 
    do until (last.id); 
    set have; 
    by id; 
    if not anymissing then output; 
    end; 
run;