2016-08-08 60 views
0

我想按城市縱向/面板數據集中的所有變量的報告。 PROC MEANS對此非常有用,但是這不能處理包含列的問題,這些列指出所討論的變量的第一個和最後一個日期是不允許的。SAS按類別爲每個變量確定第一個和最後一個非缺失ID /日期

我的數據看起來是這樣的:

data have; 
input date $ city $ var1 var2 var3; 
     datalines; 
2006Q1 NYC . 0.1 4 
2006Q2 NYC . 0.48 6 
2006Q3 NYC . 0.55 7 
2006Q4 NYC 5 0.33 2 
2007Q1 NYC 8 . 10 
2007Q3 NYC 12 . 15 
2006Q1 BOS 11 0.6 . 
2006Q2 BOS 6 0.81 . 
2006Q3 BOS 1 0.66 9 
2006Q4 BOS 2 0.5 1 
2007Q1 BOS 4 0.61 8 
2007Q3 BOS 19 0.4 1 
; 
run; 

我期望的輸出,看起來像這樣的表:

City Variable First Nonmiss Last Nonmiss 
BOS var1 2006Q1   2007Q3 
BOS var2 2006Q1   2007Q3 
BOS var3 2006Q3   2007Q3 
NYC var1 2006Q4   2007Q3 
NYC var2 2006Q1   2006Q4 
NYC var3 2006Q1   2007Q3 

也許PROC TRANSPOSEcreate tablePROC SQL是最好的方式做到這一點,但我願意接受建議 - 我並不確定從哪裏開始。

謝謝!

+1

這在'PROC MEANS'中是絕對不可能的(它不是'PROC MEANS'提供的統計數據之一)。你應該重新構造這個問題,詢問如何計算這個問題(很可能),或者,如果這是計算出來的,如何以類似於'PROC MEANS'輸出的方式報告這個問題(也很有可能)。但是,這兩件事情完全不同,我不認爲它們是一個問題。 – Joe

+0

織補。感謝您確認@Joe。我已經重新提出了相應的問題。 –

回答

1

我肯定會在這裏做一個proc transpose的方法;它非常簡單。這利用了first.last.被定義爲之後where子句被實現的事實。

proc sort data=have; 
    by city date; 
run; 

proc transpose data=have out=have_t; 
    by city date; 
    var var1-var3; 
run; 

proc sort data=have_t; 
    by city _name_ date; 
run; 

data want; 
    set have_t; 
    by city _name_ date; 
    retain first_nonmiss; 
    where not missing(col1); 
    if first._name_ then do; 
    first_nonmiss = date; 
    end; 
    if last._name_ then do; 
    last_nonmiss = date; 
    output; 
    call missing(of first_nonmiss); *I like to do this for safety even though it is irrelevant here - later code might make it relevant; 
    end; 
run; 
+0

這太棒了。謝謝!我只想確保我瞭解最後一個'data'步驟中發生了什麼。所以,'where not missing(col1)'用'col1'和'if first.'和'if last.'來分組數據,這對每個組(?)都是相同的。並且,'by city_name_ date'命令會自動創建這些city/_name_組?另外,爲什麼在那裏保留first_nonmissing而不是'last_nonmiss'。 ('call missing()'仍然超出我的理解,但總是樂於學習最佳實踐!) –

0

這絕對是有可能得到與PROC MEANS /摘要本輸出,但你需要轉置數據,使可能否定我的回答。

data have; 
input date $ city $ var1 var2 var3; 
     datalines; 
2006Q1 NYC . 0.1 4 
2006Q2 NYC . 0.48 6 
2006Q3 NYC . 0.55 7 
2006Q4 NYC 5 0.33 2 
2007Q1 NYC 8 . 10 
2007Q3 NYC 12 . 15 
2006Q1 BOS 11 0.6 . 
2006Q2 BOS 6 0.81 . 
2006Q3 BOS 1 0.66 9 
2006Q4 BOS 2 0.5 1 
2007Q1 BOS 4 0.61 8 
2007Q3 BOS 19 0.4 1 
; 
run; 
proc print; 
    run; 
data want; 
    input City $ Variable $ First_Nonmiss $ Last_Nonmiss $; 
    cards; 
BOS var1 2006Q1   2007Q3 
BOS var2 2006Q1   2007Q3 
BOS var3 2006Q3   2007Q3 
NYC var1 2006Q4   2007Q3 
NYC var2 2006Q1   2006Q4 
NYC var3 2006Q1   2007Q3 
;;;; 
proc print; 
    run; 
proc transpose data=have out=havet name=variable; 
    by city date notsorted; 
    var var:; 
    run; 
proc print; 
    run; 
proc summary data=havet nway missing; 
    class city variable; 
    where not missing(col1); 
    output out=want2(drop=_:) 
     idgroup(out(date)=first_nonmiss) 
     idgroup(last out(date)=last_nonmiss) 
     ; 
    run; 
proc print; 
    run; 
proc compare base=want compare=want2 listequalvars; 
    run; 
相關問題