我目前正在使用两个SAS数据集(样本和主数据)进行SAS编程。以下是为说明目的而创建的假设数据或虚拟数据,以通过SAS编程解决我的问题。我想从主数据集中提取样本数据集中id的数据。我举了几个id作为样本数据集的例子,我需要根据年度信息(第三个输出中给出的期望输出)从主表中提取每个id的最后12个月信息。 。
与此类似,我有很多专栏,每个id和yearmonth需要12个月的数据。
我编写了一个带有do循环的代码来迭代样本数据集的每一行,然后从每个迭代的开始(年月和结束日期(12个月前))中查找主表中的数据,然后使用proc转置转置它。然后使用id和yearmonth使用数据步骤合并将样本数据集与转置数据合并。但我觉得我编写的代码没有优化,因为它对样本数据集中的每一行都进行了多次删除并从主表中查找数据。任何人都可以帮助我使用SAS编程以优化的方式解决这个问题。
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

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更新的示例输出。
答案 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;