我想使用SAS Proc SQL在表中找到我行,其中每列都有一個非缺失值。有沒有辦法做到這一點,而不必列出所有的列名?這不起作用,但它可能會讓你知道我的預期輸出是什麼。使用SAS Proc SQL查找所有列不丟失的行?
Proc SQL;
Select *
from work.table
Where * is not null;
Run;
如果可能,我還想限制結果爲一個觀察值。謝謝。
我想使用SAS Proc SQL在表中找到我行,其中每列都有一個非缺失值。有沒有辦法做到這一點,而不必列出所有的列名?這不起作用,但它可能會讓你知道我的預期輸出是什麼。使用SAS Proc SQL查找所有列不丟失的行?
Proc SQL;
Select *
from work.table
Where * is not null;
Run;
如果可能,我還想限制結果爲一個觀察值。謝謝。
在SQL,因爲你不能在一個項目中的所有變量,而無需使用宏語言平凡的。在datastep中,這是微不足道的。
data class;
set sashelp.class;
if mod(_n_,3)=1 then call missing(age);
run;
data want;
set class;
if cmiss(of _all_)=0;
run;
cmiss
指示1,如果一個字符或數字變量缺失(和特別是在這種情況下,計數missings的總數)。您可以使用數據步驟中的obs=1
選項將其限制爲一個。
在SQL中,您必須是顯式的。 *
不是擴展列的通用宏。它是在select *
和count(*)
中恰好使用的句法元素。
所以,這樣的事情:
Proc SQL;
Select *
from work.table
Where col1 is not null and col2 is not null and col3 is not null . . .
Run;
使用SQL和字典表:
proc sql noprint;
select cats('not missing(', name, ')')
into :expression separated by " and "
from dictionary.columns
where libname = "SASHELP" and memname = "CLASS";
quit;
proc sql outobs=1;
select *
from sashelp.class
where &expression.;
quit;
這個工作!謝謝。對於將來可能想要使用Joe代碼的任何人的記錄,只需將if cmiss(of _all_)等於1而不是0,以獲得包含所有非缺失值的行。 –
爲什麼要將它更改爲1?那意味着你尋找一行*一個*缺失值。所有的拒絕將是0. – Joe
你是對的。最初cmiss = 0確實沒有返回結果,但我現在意識到這是因爲原始表中有一列,每一行都有一個缺失值。當我刪除該列時,是的,cmiss = 0是正確的。謝謝。 –