2016-08-15 18 views
0

私の質問の答えを探していましたが、見つけられませんでしたので、ここに質問を投稿します。 私は巨大なデータセットを持っています。私は質問をする前に、それがどのように見え、何をしたいのかを説明します。1時間の時間枠を設定してからSASでループする

**ID** **Website** **Datetime**  **Googlevisit** 
A  Google  2014/06/01 16:50  1 
A  Facebook  2014/06/01 17:40  1 
A  Yahoo  2014/06/01 18:00  0 
A  Facebook  2014/06/01 18:10  0 
A  Google  2014/06/01 19:00  1 
B  Amazon  
B  Aol   
B  Facebook  
C  SouthWest  

IDは個人IDです。 ウェブサイトは、各個人が閲覧した場所です。 日時は、各個人がウェブサイトを閲覧した日時です。

私がやりたいことは、現在の行時間から1時間前の間隔を設定し、個人が1時間以内にGoogleに行ったかどうかを確認することです。 たとえば、19:00から18:00までの個人Aが1時間以内に少なくとも1回はGoogleを検索した場合、新しい列の新しい値は1です。 再び、個人Aは18:10から17:10に変更されませんでした再び、18:00から17:00までの個人AはGoogleを検索しなかったので、値は0です。 再び、個人Aは17:40から16: 40はそのインターバル内でGoogleを少なくとも1回検索したので、その値は1です。

私はコーディングでそれほど良くはありませんでしたが、私はこの解決策を得るのに疲れました。

私はthis->

DATA A; SET A; 
if Website='Google' then Googlevisit=1; 
else Googlevisit=0; 
where Datetime between INTNX('second',Datetime,-3600) and Datetime; 
run; 

もこのtoo->

DATA A; SET A; 
if Datetime=>INTNX('second',Datetime,-3600) and Datetime<=Datetime then do; 
if Website='Google' then Googlevisit=1; 
else Googlevisit=0; 
end; 
run; 

しようとした私は、これら2つのコードは、1時間の間隔をキャプチャするつもりだったと思ったけどなかったです。 特定の時間に個人がgoogleにアクセスした場合、その行の新しい値は1または0になります。 誰かが私を助けてくれたら幸いです。私はこれを1週間以上解決しようとしていたので、とても切迫しています。

答えて

0

情報をある行から次の行に保存しようとしています。 RETAINにする必要があります。

data have; 
input ID $ Website $ Datetime :ANYDTDTM16.; 
datalines ; 
A  Google  2014/06/01-16:50  
A  Facebook  2014/06/01-17:40  
A  Yahoo  2014/06/01-18:00  
A  Facebook  2014/06/01-18:10  
A  Google  2014/06/01-19:00 
; 
run; 

data want; 
    set have; 
    by ID; 

    retain googletime ; 
    if first.id then googletime =. ; 
    if Website='Google' then googletime=Datetime; 

    Googlevisit = (Datetime <= INTNX('second',googletime,3600)); 

run; 

。保持: SASは、ソートされた順序で行によって、データセットの行を処理します。 where Datetime between INTNX('second',Datetime,-3600) and Datetime;は、行を常に自分と比較しているので、望ましい結果を得られません。新しい変数を生成して保持することで、元の日時の値を保持し、それを次の行で比較することができます。 (そうしなければ、SASは新しい変数をdatastepの各反復で欠損にリセットするので、RETAINは必要です)。

Googlevisit = (Datetime <= INTNX('second',googletime,3600)); SASは、真または偽のいずれかになります条件aとしてこれを計算して、私は本当にあなたの助けに感謝Googlevisit

+0

変数に1/0の値を返します。コードは私のデータセットで完璧に機能しました!あなたのコードについて2つの質問があります。あなたが 'googlevisit = 1ならば、それ以外の場合はgooglevisit = 0'と書き留めなくても、このコードはうまくいきました。具体的には、SASが新しい値を認識したのは、そのようにコードを作成していないにもかかわらず、1または0のいずれかでなければなりません。 2.SASは、現在の行の日時から過去までの時間間隔の設定を認識しませんか?あなたのコードは、現在の行datetimeと1時間の未来の間隔を設定するためです。 –

+0

2.間隔の方向は問題ではありませんでした。私はちょうど正の間隔を選びました。新しい日付と古い日付とを比較しています。値を保持する方法については、私の編集を参照してください。 datetimeの値を自分自身と比較しているので、あなたのアプローチはうまくいきませんでした。 – Jetzler

関連する問題