首页 > 解决方案 > 在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

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

标签: sas

解决方案


您可以使用 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,如果全部为否,则为 0)


推荐阅读