2016-11-08 91 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; 

只要让我知道,如果任何问题这里...

相关问题