将多个记录压缩为sas中的单个记录

问题描述

我有按帐户级别划分的行数据,我希望按帐户所有者将其分组为新数据。是,将优先。

Account_Owner    Account_No    Ever_Purchase    Ever_Purchase_within_2days   Ever_Deliver_in_2weeks
Tom              12345         Yes              Yes                          No
Tom              34567         Yes              No                           Yes
Tom              09876         No               No                           No

Desired Outcome
Account_Owner    Ever_Purchase    Ever_Purchase_within_2days   Ever_Deliver_in_2weeks
Tom               Yes              Yes                          Yes

很抱歉,我没有任何代码,因为我不知道从哪里开始。

解决方法

您可以使用DOW循环来跟踪临时数组中每个ever_*变量的分组结果。

proc format;
  value yesno .,0 = 'No' other='Yes';

data have; input 
Account_Owner  $  Account_No    Ever_Purchase $   Ever_Purchase_within_2days $  Ever_Deliver_in_2weeks $;
datalines;
Tom              12345         Yes              Yes                          No
Tom              34567         Yes              No                           Yes
Tom              09876         No               No                           No
;

data want;
  array evals(100) _temporary_; * presume never more than 100 flag variables;
  call missing (of evals(*));

  * dow loop;
  do until (last.account_owner);
    set have;
    by account_owner;

    array flags ever:;
    do _n_ = 1 to dim(flags);
      evals(_n_) = evals(_n_) or flags(_n_) = 'Yes';  * compute aggregate result;
    end;
  end;

  * move results back into original variables;
  do _n_ = 1 to dim(flags);
    flags(_n_) = put(evals(_n_),yesno.);
  end;

  * implicit output,one row per group combination;
run;

注意:在另一种解决方案中,您可以将Yes / No转换为数字1/0,可以使用Proc Summary或​​Proc MEANS计算组结果(如果是,则var的最大值为1,如果全部为否,则var的最大值为0)