我有一个由客户完成的一些交易组成的数据集
我想将这些事务放入1到50的数组中。因此,1个客户可以拥有50个或更多交易。我希望每个客户的输出数据集为1行,每个事务的值都放入一列。
最后我要做的是将这些事务值放在数组中。在first.cust_id上将数组重置为0。知道如何做到这一点。这是我到目前为止,但它给了我错误。假设初始数据集只有cust_id和transaction_amount字段。
代码表示只是数组启动。我之后用数组做了一些计算。
data check;
set transactions;
by cust_id;
array trans[*] trans1-trans50;
retain array_counter;
if first.cust_id then do;
do i=1 to dim(trans);
trans[i]=0;
end;
array_counter=1;
end;
trans[array_counter] = transaction_amount;
array_counter=sum(array_counter,1);
if last.cust_id;
run;
答案 0 :(得分:0)
您的代码中有一些问题。对于初学者,要使用first
/ last
处理,您需要by
语句。然后,为了每个客户只获得一行,您还需要retain
数组变量并仅在last.cust_id
输出:
data check;
set transactions;
by cust_id;
array trans[*] trans1-trans50;
retain array_counter trans1-trans50;
if first.cust_id then do;
do i=1 to dim(trans);
trans[i]=0;
end;
array_counter=1;
end;
trans[array_counter] = transaction_amount;
array_counter+1;
if last.cust_id then output;
run;
答案 1 :(得分:0)
首先,您需要一个retain
。如果没有这个,trans
数组的值将在每个数据步循环中被清除。
其次,如果你说“50或更多”交易;好吧,你的数组边界只允许50,那么它对51做了什么?
这是有效的,我将其设置为每个客户30个,这样你就可以看到0了。如果将初始1到30循环设置为1到60,则会出现超出界限的错误。
data transactions;
call streaminit(7);
do cust_id = 1 to 10;
do transaction = 1 to 30;
transaction_amount = rand('uniform');
output;
end;
end;
run;
data check;
set transactions;
by cust_id;
retain trans1-trans50;
array trans[*] trans1-trans50;
retain array_counter;
if first.cust_id then do;
do i=1 to dim(trans);
trans[i]=0;
end;
array_counter=1;
end;
trans[array_counter] = transaction_amount;
array_counter=sum(array_counter,1);
if last.cust_id;
run;