使用sas有效地从主表中提取每个id和月的最后12个月数据

时间:2017-04-15 15:17:31

标签: sas

我目前正在使用两个SAS数据集(样本和主数据)进行SAS编程。以下是为说明目的而创建的假设数据或虚拟数据,以通过SAS编程解决我的问题。我想从主数据集中提取样本数据集中id的数据。我举了几个id作为样本数据集的例子,我需要根据年度信息(第三个输出中给出的期望输出)从主表中提取每个id的最后12个月信息。 。

与此类似,我有很多专栏,每个id和yearmonth需要12个月的数据。

我编写了一个带有do循环的代码来迭代样本数据集的每一行,然后从每个迭代的开始(年月和结束日期(12个月前))中查找主表中的数据,然后使用proc转置转置它。然后使用id和yearmonth使用数据步骤合并将样本数据集与转置数据合并。但我觉得我编写的代码没有优化,因为它对样本数据集中的每一行都进行了多次删除并从主表中查找数据。任何人都可以帮助我使用SAS编程以优化的方式解决这个问题。

  1. 一个样本数据集(数据集名称 - 样本)。
  2. 
    
    ID  YEARMONTH NO_OF_CUST
    1    200909	    50
    1    201005	    65
    1    201008	    78
    1    201106	    95
    2    200901	    65
    2    200902	    45
    2    200903	    69
    2    201005	    14
    2    201006	    26
    2    201007	    98
    3    201011	    75
    3    201012	    75
    
    
    

    1. 一个主数据集(数据集名称 - 从帐户开始到日期的每个ID的一年中的主数据集大数据集。)
    2. 
      
      ID	YEARMONTH	NO_OF_CUST
      
      1	200808	125
      1	200809	125
      1	200810	111
      1	200811	174
      1	200812	98
      1	200901	45
      1	200902	74
      1	200903	73
      1	200904	101
      1	200905	164
      1	200906	104
      1	200907	22
      1	200908	35
      1	200909	50
      1	200910	77
      1	200911	86
      1	200912	95
      1	201001	95
      1	201002	87
      1	201003	79
      1	201004	71
      1	201005	65
      1	201006	66
      1	201007	66
      1	201008	78
      1	201009	88
      1	201010	54
      1	201011	45
      1	201012	100
      1	201101	136
      1	201102	111
      1	201103	17
      1	201104	77
      1	201105	111
      1	201106	95
      1	201107	79
      1	201108	777
      1	201109	758
      1	201110	32
      1	201111	15
      1	201112	22
      2	200711	150
      2	200712	150
      2	200801	44
      2	200802	385
      2	200803	65
      2	200804	66
      2	200805	200
      2	200806	333
      2	200807	285
      2	200808	265
      2	200809	222
      2	200810	220
      2	200811	205
      2	200812	185
      2	200901	65
      2	200902	45
      2	200903	69
      2	200904	546
      2	200905	21
      2	200906	256
      2	200907	214
      2	200908	14
      2	200909	44
      2	200910	65
      2	200911	88
      2	200912	79
      2	201001	65
      2	201002	45
      2	201003	69
      2	201004	54
      2	201005	14
      2	201006	26
      2	201007	98
      3	200912	77
      3	201001	66
      3	201002	69
      3	201003	7
      3	201004	7
      3	201005	7
      3	201006	65
      3	201007	75
      3	201008	85
      3	201009	89
      3	201010	100
      3	201011	75
      3	201012	75
      
      
      

      以下是我尝试为样本数据集中的每个样本ID更新的示例输出。

      enter image description here

1 个答案:

答案 0 :(得分:1)

如果没有您目前尝试做的示例代码,那么找出您想要的内容有点困难,但获得与图像文件相同结果的“SAS”方式可能如下。

编辑:编辑我的答案,因此ID需要过去12个月

data test;
    infile datalines dlm='09'x;
    input ID YEARMONTH NO_OF_CUST;
    datalines;
1   200808  125
1   200809  125
1   200810  111
1   200811  174
1   200812  98
1   200901  45
1   200902  74
1   200903  73
1   200904  101
1   200905  164
1   200906  104
1   200907  22
1   200908  35
1   200909  50
1   200910  77
1   200911  86
1   200912  95
1   201001  95
1   201002  87
1   201003  79
1   201004  71
1   201005  65
1   201006  66
1   201007  66
1   201008  78
1   201009  88
1   201010  54
1   201011  45
1   201012  100
1   201101  136
1   201102  111
1   201103  17
1   201104  77
1   201105  111
1   201106  95
1   201107  79
1   201108  777
1   201109  758
1   201110  32
1   201111  15
1   201112  22
2   200711  150
2   200712  150
2   200801  44
2   200802  385
2   200803  65
2   200804  66
2   200805  200
2   200806  333
2   200807  285
2   200808  265
2   200809  222
2   200810  220
2   200811  205
2   200812  185
2   200901  65
2   200902  45
2   200903  69
2   200904  546
2   200905  21
2   200906  256
2   200907  214
2   200908  14
2   200909  44
2   200910  65
2   200911  88
2   200912  79
2   201001  65
2   201002  45
2   201003  69
2   201004  54
2   201005  14
2   201006  26
2   201007  98
3   200912  77
3   201001  66
3   201002  69
3   201003  7
3   201004  7
3   201005  7
3   201006  65
3   201007  75
3   201008  85
3   201009  89
3   201010  100
3   201011  75
3   201012  75
;
run;

proc sort data=test;
    by id yearmonth;
run;

data result;
    set test;
    array prev_month {13} PREV_MONTH_0-PREV_MONTH_12;
    by id;

    if first.id then do;
        do i = 1 to 13;
            prev_month(i) = 0;
        end;
    end;

    do i = 13 to 2 by -1;
        prev_month(i) = prev_month(i-1);
    end;
    prev_month(1) = NO_OF_CUST;

    drop i PREV_MONTH_0;
    retain PREV_MONTH:;
run;