2016-11-08 95 views
0

我想在'V1'列中的每個唯一值的'Date'列中添加連續日期。下面解釋我在做什麼和我得到什麼錯誤(無法計算日期)。如何在一列SAS EG表格中插入其他列中每個var的連續日期範圍

我有一個表,如下所示:

V1   Date 
MS000328 04JAN16 
MS000328 08JAN16 
MS000328 12JAN16 
MS000328 08FEB16 
MS000328 09FEB16 
MS000328 12MAR16 
MS000328 15MAR16 
MS000328 16APR16 
MS000328 17APR16 
MS000329 02JAN16 
MS000329 16JAN16 
MS000329 29JAN16 
MS000329 03FEB16 
MS000329 19FEB16 
MS000329 21MAR16 
MS000329 31MAR16 
MS000329 11APR16 
MS000329 19APR16 

我想要的是這樣的:

V1   Date 
MS000328 01JAN16 
MS000328 02JAN16 
MS000328 03JAN16 
MS000328 04JAN16 
MS000328 05JAN16 
MS000328 06JAN16 
MS000328 07JAN16 
MS000328 08JAN16 
. 
. 
. 
. 
. 
MS000329 01JAN16 
MS000329 02JAN16 
MS000329 03MAR16 
. 
. 
MS000329 01APR16 
MS000329 02APR16 
. 
. 
MS000329 01MAR16 
MS000329 02MAR16 
. 
. 
MS000329 01APR16 
MS000329 02APR16 
. 
. 
. 

我使用的follwing代碼....

data want1 (keep = V1 Date); 
    set have; 
    by V1; 
run; 

data want; 
    set want1; 
    format Date date.; 
    Date = "1JAN2016"d; 
    do i = 0 to 365; 
    Date+1; 
    output; 
    end; 
run; 

結果日誌顯示錯誤...'文件空間不足'

我做錯了什麼?

回答

2

如果您擁有ETS許可,那麼PROC EXPAND將爲您做到這一點 - 這正是它的目的。

如果你不這樣做,你需要做一些與你在代碼中做的稍微不同的事情。 RETAIN在這裏很有幫助。你需要做類似的事情,但是如果你想要其他的值,並且想要保存轉發而不是倒退(就像我的代碼所做的那樣),或者想要做其他事情(比如「最近的日期」),你需要做些類似的事情。

data have; 
input V1 $ Date :date7.; 
datalines; 
MS000328 04JAN16 
MS000328 08JAN16 
MS000328 12JAN16 
MS000328 08FEB16 
MS000328 09FEB16 
MS000328 12MAR16 
MS000328 15MAR16 
MS000328 16APR16 
MS000328 17APR16 
MS000329 02JAN16 
MS000329 16JAN16 
MS000329 29JAN16 
MS000329 03FEB16 
MS000329 19FEB16 
MS000329 21MAR16 
MS000329 31MAR16 
MS000329 11APR16 
MS000329 19APR16 
;;;; 
run; 

data want(rename=tempdate=date); 
    set have; 
    by v1; 
    retain lastDate; 
    drop date lastdate; 

    if first.v1 then lastDate = '31DEC2015'd; *lets us start on JAN 1; 

    do tempdate = lastDate+1 to date;   *iterate from previous date + 1 to current date; 
    output; 
    end; 

    if last.V1 then do;      *if last record, need to iterate until DEC31, I think; 
    do tempDate = date+1 to '31DEC2016'd; 
     output; 
    end; 

    end; 

    lastDate = date;       *save current date for next iteration; 
    format tempDate date9.; 
run; 
+0

am我認爲'proc expand'只能填寫數據中第一個和最後一個之間的缺失日期,即它不能在第一個日期之前或在最後一個日期之後? – Longfish

+0

@Keith我認爲你是正確的(它只會插入範圍內),儘管通過爲兩個開始/結束日期添加單行很容易修復。我認爲PROC EXPAND的價值主要在於處理數據集上的其他變量(例如,繼續推進更容易)以及它能夠計算值而不僅僅是填充;如果這只是一個行的問題,上面的過程可能就像開始/結束問題一樣好。 – Joe

+0

@Joe感謝您的幫助。我們擁有SAS EG和其他SAS產品的許可:) – ZeekDSA

0

我懷疑是上述過程會導致內存問題....

還是我的答案如下...

Data Have; 
    Input V1 $ Date Date9.; 
    Format Date Date9.; 
    Datalines; 

MS000328 04JAN16 
MS000328 08JAN16 
MS000328 12JAN16 
MS000328 08FEB16 
MS000328 09FEB16 
MS000328 12MAR16 
MS000328 15MAR16 
MS000328 16APR16 
MS000328 17APR16 
MS000329 02JAN16 
MS000329 16JAN16 
MS000329 29JAN16 
MS000329 03FEB16 
MS000329 19FEB16 
MS000329 21MAR16 
MS000329 31MAR16 
MS000329 11APR16 
MS000329 19APR16 
; 
Run; 

/* Series of Dates */ 
Data Dates (Keep=Date); 
    Format Date Date9.; 
    Do i=0 To 365; 
    Date=IntNX('day','01JAN2016'd,i); 
    Output; 
    End; 
Run; 

/* Vars */ 
Proc SQL; 
    Create Table V1_IDs As Select Distinct V1 From Have Order By V1; 
Quit; 

/* series */ 
Proc SQL; 
    Create Table Want As Select * From V1_IDs,Dates; 
Quit; 

只要讓我知道,如果任何問題這裏...

相關問題