2016-06-23 9 views
0

私は出生数をカウントしようとしています。データはSASの最初と最後の文

ID  date 
101  2016-01-01 
101  2016-02-01 
101  2016-02-01 
102  2015-03-02 
102  2016-04-01 
103  2016-02-08 

はだから今、私は日付 期待出力も私が最初と最後でそれをやろうとしていますこのよう

ID  date   count 
101  2016-01-01  1 
101  2016-02-01  2 
101  2016-02-01  2 
102  2015-03-02  1 
102  2016-04-01  2 
103  2016-02-08  1 

であるとに基づいて、カウントを作成したい、このように見えますprocのSQL​​からのカウントが、私はここで何かを見逃しています。

data temp; 
set temp; 

by ID DATE notsorted; 

if first.date then c=1; 
else c+1; 


if first.ID then m=1; 
else m+1; 

run; 
+0

出力表について説明してください。私はCOUNT変数の背後にある論理を理解していません。 IDと日付によるカウントでなければ、最後の2行が間違っています。 – Jetzler

+0

はい、申し訳ありませんが間違って入力した、私は今それを修正しました。 – user3658367

答えて

2

あなたの独創的なアプローチ

data x; 
input id : 3. date : ddmmyy10.; 
FORMAT DATE ddmmyy10.; 
datalines; 
101 01-01-2016 
101 02-01-2016 
101 02-01-2016 
102 03-02-2015 
102 04-01-2016 
103 02-08-2016 
; 

run; 

data x; 
set x; 

by ID DATE notsorted; 

if first.ID then c=0; /*reset count every time id changes*/ 
if first.date then c+1; /*raise count when date changes*/ 

run; 

を持つ別の解決策は、私は、以前のコードを編集した、
enter image description here

+0

thi sperfectly works ..ありがとうkl78 – user3658367

0

必ず最初に使用する必要がありますか?

この作成されます私はこの

data have; 
    infile datalines delimiter='09'x; 
    input ID $ date $10. ; 
    datalines; 
101 2016-01-01 
101 2016-02-01 
101 2016-02-01 
102 2015-03-02 
102 2016-04-01 
103 2016-02-08 
;run; 

proc freq DATA=have NOPRINT; 
    TABLES ID * date/OUT=want(drop=percent); 
run; 

を達成するためのproc FREQを使用します。あなたはdatastepでCOUNTを再現したい場合は、二重DOWを使用する必要があります

ID date count 
101 2016-01-01 1 
101 2016-02-01 2 
102 2015-03-02 1 
102 2016-04-01 1 
103 2016-02-08 1 
0

を。データセットは2回SETされます。最初にIDと日付で行を数えます。 2回目はすべての行を出力します。

data out; 
    do _n_ = 1 by 1 until (last.date); 
    set test ; 
    by ID date; 
    if first.date then count = 1; 
    else count + 1; 
    end; 
    do _n_ = 1 by 1 until (last.date); 
    set test ; 
    by ID date; 
    output; 
    end; 
run; 
0

データステップにRETAIN文を追加するのは忘れてしまいます。

data temp; 
set temp; 
retain c m 0; 

by ID DATE notsorted; 

if first.date then c=1; 
else c+1; 


if first.ID then m=1; 
else m+1; 

run; 
+1

sum文(c + 1)を使用するときは、明示的なRETAINは必要ありません。 – Tom

+0

はい、同意します...私はちょうどそれを試みた....ありがとう! –

0

オーケー生成します。うまくいけば、これはあなたのニーズに合っています。 IDと日付でテーブルを並べ替えることができるように、日付変数が数値またはカレンダー形式であることを確認してください。

data want; 
set have; 
by id date; 

if first.date then count=0; 
count+1; 

run; 
+0

こんにちは私は同じことをしましたが、主な問題は、IDの2番目の配信であり、2番目の配信でトリプレットがある場合、これは間違っています。配達は3の代わりに2でなければなりません – user3658367

関連する問題