2014-01-27 64 views
0

我有很多不同列(變量)名稱的表,其中唯一通用的列名爲日期,所以我有很多數據,每個都有一定的日期。自動獲取非缺失行數

爲了測試是否有對某些列我有任何遺漏值來寫這樣一個對每個表的SQL查詢,東西:

proc sql; 
    create table check as 
    select Date, count(Date) as date_count, count(col_x) as col_x, count(col_y) as col_y, .. 
    from certain_table 
    group by Date; 
quit; 

所以我必須手動寫計數(XXX)爲YYY部分適用於每個桌子。

有沒有一種方法可以編寫某種通用查詢,它可以自動計算表中按列分組的每個列的非缺失行(在我的案例中爲Date),並以類似於一個列的形式顯示它上面的代碼?

回答

4

我正在確定哪些列包含缺失數據的路線,因爲這似乎是您主要關心的問題。我還假設你的變量是字符和數字的混合體,我的解決方案將適用於兩者。 PROC FREQ中有一個NLEVELS選項,用於輸出列中不同值的數量,並且單獨顯示任何缺失值。以下是示例代碼,如果您想按日期對數據進行分組,則必須預先設置表並在PROC FREQ中放置BY語句。

data class; 
set sashelp.class; 
if _n_=1 then call missing(name,height); /* set a couple of variables to missing in row 1 */ 
run; 

ods select nlevels; /* only calculate the nlevels stats */ 
ods output nlevels=want; /* output results to a dataset */ 
proc freq data=class nlevels; 
run; 
; 
+0

有什麼解決方案沒有presorting?在這種情況下,sql更好,因爲它只允許使用我所擁有的,但缺點是我必須手動定義所有列名。 – kaytrance

+0

不符合我的解決方案。您的數據是否自動按日期排序?您能否澄清一下變量是否是字符和數字的混合,或者只是數字 – Longfish

+0

是的,數據不是按日期自動排序的,並且數據集中有數字和字符變量。 – kaytrance

1

PROC TABULATE可以很容易地做到這一點,就像幾個統計過程一樣。我爲_numeric_這樣做,它允許我使用var而不是class,更好的輸出。如果你確實需要字符變量,你可以用class來完成,只需刪除不感興趣的行。

proc tabulate data=sashelp.class out=want; 
var _numeric_; 
tables _numeric_,n nmiss; 
run; 
+0

這個解決方案相當不錯,雖然通過Date添加分組會使輸出變得雜亂無章。它能以某種方式在http://pastebin.com/0F8ZefGq上描述的方式轉變嗎?因此,這個想法並不是爲每個變量顯示n nmiss,而是顯示特定日期的總觀測數(因爲日期字段總是存在),並且每個變量只顯示缺失的數量。並在一個表中得到結果。 – kaytrance