2017-06-16 15 views
0

我有一个数据集,每个ID按日期排序有多个行。 我想为每行分割我的数据集,并将第n + 1行日期的值放入第n行的另一列中。如果ID只有一行,则该值已经被定义。然后,我想分割我的数据集为计数= 1,然后计数= 2,等等...我怎么能做到这一点在SAS?如何在SAS中每个ID有多个行的情况下将第n + 1个值从变量放入第n行的另一列中?

ID date end_period  age_end count 
    1 n  n+1    value 1 
    1 n+1  N+2    value 2 
    1 N+2  n+3    value 3 
    1 n+3  value(age_end) value 4 
    2 n  value(age_end) value 1 
+0

所以这是一个展望未来的问题?你想计算end_period?我建议你展示你要开始的数据(用真实的实际值,而不是n + 1等),并显示你想创建的数据。听起来你可能想创建end_period变量,然后创建四个输出数据集? – Quentin

回答

0

正如昆汀提到的,在看到一些样本数据的时候很难说。我有点理解他们提到你需要创建2个字段。如果,和一个巨大的IF,你的日期是一个SAS日期,那么你可以简单地做到这一点...

end_period = date + 1; 

如果不是的话,我会建议一个号码或文字转换为SAS日期。

如果Count是不是在你的数据集,然后简单地分类和按组处理这样可以很容易地计算字段

data dsn_final; 
    set dsn_name; 
    by ID Date; 
    if first.ID then Count=1; 
    else Count+1; 
run; 

最后分解为单独的数据集。如果存在未知的最大数量...意味着您不知道数据集中任何ID的最大行数是否过大或可能更改,那么我建议使用宏创建单独的数据数据集。首先找到最大值并将其存储在一个宏变量中。然后将基于计数的数据集拆分为最大计数。

proc sql noprint; 
    select max(count) 
      into: max_count 
    from simulate; 
quit; 

%put &max_count.; 

%macro datasets; 
data %do count=1 %to &max_count; 
     date&count. (drop=count) 
    %end; ; 
set simulate; 
    %do count=1 %to &max_count; 
     if count = &count. then output date&count.; 
    %end; 
run; 
%mend; 
%datasets; 

如果用数据的样本进行回应则有可能是更容易的方法,但我的理解,你需要计算2场,然后分裂。如果你知道最大值,分割将更容易。我只会使用宏,如果它是未知的或可能在未来使用和数据更改最大数量可能会改变。

相关问题