簡體   English   中英

SAS數據步驟| 2個日期之間

[英]SAS Data Step | Between 2 Dates

可能是一個簡單的問題。 我有一個簡單的數據集,上面有預定的付款日期。

DATA INFORM2;
 INFORMAT previous_pmt_date scheduled_pmt_date MMDDYY10.;
 INPUT previous_pmt_date scheduled_pmt_date;
 FORMAT previous_pmt_date scheduled_pmt_date MMDDYYS10.;
DATALINES;
11/16/2015 12/16/2015
12/17/2015 01/16/2016
01/17/2016 02/16/2016

; 

我正在嘗試做的是創建一個二進制的最新行指示器。 例如,如果我想知道截至1/31/2016的最新行,則希望將第2行標記為最新行。 我之前一直在做的工作是找出2016年1月31日在previous_pmt_date和Scheduled_pmt_date之間的位置,但這對我而言並不正確。 我想在數據步驟而不是SQL子查詢中執行此操作。 有任何想法嗎?

想:

previous_pmt_date scheduled_pmt_date latest_row_ind
11/16/2015        12/16/2015         0
12/17/2015        01/16/2016         1
01/17/2016        02/16/2016         0

這是一個解決方案,可在單個現有數據步驟中完成所有操作,而無需任何其他排序。 首先,我將略微修改您的數據以包括帳戶,因為該解決方案實際上還應該考慮到這一點:

DATA INFORM2;
 INFORMAT previous_pmt_date scheduled_pmt_date MMDDYY10.;
 INPUT account previous_pmt_date scheduled_pmt_date;
 FORMAT previous_pmt_date scheduled_pmt_date MMDDYYS10.;
DATALINES;
1 11/16/2015 12/16/2015
1 12/17/2015 01/16/2016
1 01/17/2016 02/16/2016
2 11/16/2015 12/16/2015
2 12/17/2015 01/16/2016
2 01/17/2016 02/16/2016

; 
run;

指定截止日期:

%let cutoff_date = %sysfunc(mdy(1,31,2016));

此解決方案使用此問題中的方法將變量保存在數據的下一行中到當前行中。 如果需要,您可以在末尾刪除var(我出於測試目的已將其注釋掉)。

data want;
  set inform2 end=eof;
  by account scheduled_pmt_date; 

  recno = _n_ + 1;

  if not eof then do;
    set inform2 (keep=account previous_pmt_date scheduled_pmt_date
                 rename=(account            = next_account 
                         previous_pmt_date  = next_previous_pmt_date
                         scheduled_pmt_date = next_scheduled_pmt_date)
                ) point=recno;
  end;
  else do;
    call missing(next_account, next_previous_pmt_date, next_scheduled_pmt_date);
  end;

  select;
    when ( next_account eq account and next_scheduled_pmt_date gt &cutoff_date ) flag='a';
    when ( next_account ne account ) flag='b';
    otherwise flag = 'z';
  end;

  *drop next:;

run;

該方法通過使用數據集中的當前觀測值(通過_n_獲得)並將其加1來獲得下一個觀測值而_n_ 然后,我們使用帶有point=選項的第二個set語句加載該下一個觀察值,並同時重命名變量,以使它們不會覆蓋當前變量。

然后,我們使用一些邏輯來標記必要的記錄。 我並不是您所需要的邏輯的100%,因此,我提供了一些示例邏輯,並使用了不同的標志來顯示正在觸發的邏輯。

一些注意事項...

by語句不是嚴格必需的,但我將其包括在內是為了(a)確保數據正確排序,並且(b)由於某些邏輯需要這種排序順序,因此可以幫助將來的讀者理解數據步驟的意圖。

call missing語句只是在這里清理日志。 當您的變量沒有得到賦值時,SAS不會喜歡它,這將在最后一次觀察中發生,因此這就是我們包括此原因的原因。 注釋掉,看看會發生什么。

end=eof語法基本上會創建一個名為eof的臨時變量,當我們到達該set語句的最后一個觀察值時,該變量的值為1。 我們只是使用它來確定我們是否在最后一行。

最后但非常重要的一點是,請確保在加載第二個數據集時僅保留所需的變量,否則將覆蓋原始數據中的現有變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM