将单个客户交易放入数组

时间:2017-10-03 13:07:17

标签: arrays sas

我有一个由客户完成的一些交易组成的数据集

我想将这些事务放入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;

2 个答案:

答案 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;