噢,那按照这个解释,我的理解其实date这个变量就不存在了,因为amt已经含有时间的信息。
按照标准的SQL格式,card_no是primary key,类似于唯一的标识用户ID,每一个ID的行为记录为每一行的关系数据。
而原文中的amt,其实可以按列来扩展,是已按月份区分的交易数额记录。
与之相对的数据结构在SQL关系表或者SAS数据集里大概是这个样子:
obs card_no amt1 amt2 amt3 ... amt12
1 xxx 789 ... . .
2 yyy 123 ... . .
3 zzz 456 ... . .
这里我将问题先简化,该表中只有2012年12个月的数据(所以amt系列只有十二列),如下图所示:
显然,这个造的数据表里只有两行符合九十两月没有消费的情况,再做进一步筛选六七八月的数据之后我们期望只有一个记录符合筛选,那就是倒数第二行。
对应SAS代码如下:
/*先将原始数据表导入到SAS数据集,假定原表是excel格式*/
PROC IMPORT DATAFILE = 'D:\SAS9\My SAS Files\9.0\Little SAS Book Codes\trans.xls' DBMS=excel OUT = trans REPLACE;
RUN;
data test;
set trans(obs=10); /*先取前十行小试*/
array myar(*) amt6 - amt10; /*数组只关心这五列数据*/
/*先整理数据,所有交易额缺失的数据均视为0*/
do i=1 to 5;
if myar(i) = . then myar(i) = 0;
end;
/*先把符合九十月为0的记录给找出来*/
if not(myar(4)OR myar(5));
/*然后对六七八月进行筛选*/
do i = 1 to 3;
if (51 <= myar(i) <=100);
end;
drop i;
put card_no=;
run;
导入后的数据集trans, 及筛选运行后的结果显示如下:
card_no=5566778899001122
注意,代码里我的筛选条件是三个月中每个月的消费额都要满足在51到100之间,如果你的本意是三个月的消费总额
要在51到100之间,可对应把条件改为求和便是。
说明下用数组实现的好处:
1. 方便把缺失数据置零
2. 方便用循环下标做筛选操作
最后我想说,其实数据的前期整理往往比SAS本身的程序实现更繁琐也更重要。比如这个例子里,我已经假定了交易额记录是按月记录排序的,这是个很重要的简化假设,如果原始数据里是用更复杂的时间记录,而不是简单的月份标记,那么需要先行调用时间函数来算出哪一列对应是2012年哪个月,那无疑才是更繁重的任务。



雷达卡







[em19][em19]有人帮忙不
京公网安备 11010802022788号







