2016-12-14 7 views
1

私はSASでこのようなデータを持っています。SASで複数の列を日付で集計する

Date Type_1 Type_2 
4/8/2015 21654.72 . 
4/9/2015 34490.13 . 
4/9/2015 32429  . 
4/9/2015 .  24438.76 
4/9/2015 .  54043.18 
4/9/2015 .  58969.06 
4/9/2015 .  57721.01 
4/9/2015 .  46313.08 
4/10/2015 .  49974.06 
4/10/2015 .  52403.41 
4/10/2015 25260.07 . 
4/10/2015 27891.98 . 
4/11/2015 .  28130.06 
4/11/2015 24886.15 . 
4/11/2015 10407.6 . 
4/11/2015 49422.71 . 
4/11/2015 15242.28 . 
4/11/2015 .  25295.52 
4/11/2015 .  17522.67 
4/13/2015 29798.99 . 
4/13/2015 10445.17 . 
4/13/2015 23678.87 . 
4/13/2015 .  35470.87 
4/13/2015 .  33941.01 
4/13/2015 .  30206.06 
4/13/2015 .  26591.98 

SASデータステップを使用してtype_1とtype_2を合計し、両方の列を日付別に統合しようとしています。

私はこのようなコードを試してみた

data work.data; 
    set data_consolidated; 
    by date; 

    if first.date then total_type_1=0 and total_type_2=0; 
    total_type_1 + type_1; 
    total_type_2 + type_2; 
    if last.date then output; 
    drop type_1; 
    drop_type_2; 
run; 

このコードは、日付をconsilidates、代わりに日付の列にあるすべての値を合計すると、それはすべての以前の値に現在の値を加算しています累積的に

だけ明確にするために、以下の私は、データが見えるように取得しようとしているものの例である:

date  type_1  type_2 
4/8/2015 21654.72 . 
4/9/2015 66919.13 128472.85 
4/10/2015 53152.05 102377.47 
4/11/2015 99958.74 70948.25 

何かアドバイスやヘルプは大歓迎です。

答えて

2

はこれを試してみてください:

proc sql; 
    select distinct date, sum(type_1) as type_1, sum(type_2) as type_2 from data_consolidated group by date; 
quit; 
+0

これは完全に機能します。私はデータのステップに私の心を設定してproc SQLを調べていないと思う。ありがとうございます@陳林陳! – Jarom

1

私はあなたの問題は、このラインだと思います。

if first.date then total_type_1=0 and total_type_2=0; 

これは、代入文の右辺のブール式の評価に基づいて(偽)(真)または0〜1のいずれかにtotal_type_1の設定になります。 total_type_2の値は変更されません。

おそらく、あなたがする意図:

if first.date then total_type_1=0; 
if first.date then total_type_2=0; 

または

if first.date then do; 
    total_type_1=0; 
    total_type_2=0; 
end; 

をDOWループを使用して、データのステップで事のこのタイプを行うには良い方法です。

data want; 
    do until(last.date); 
    set data_consolidated; 
    by date; 
    total_type_1 = sum(total_type_1,type_1,0); 
    total_type_2 = sum(total_type_2,type_2,0); 
    end; 
    drop type_1 type_2 ; 
run; 
+0

それは問題であるようでした。今は明らかですが、適切に実行するために回線を2つに分割する必要があることはわかりませんでした。 – Jarom