SAS:如何在有条件的情况下折叠观察结果
SAS : How to collapse observations, while making a total, with a condition
我有一个看起来像这样的数据库:
DATA money;
INPUT id condition money;
CARDS;
1 1 453
5 1 9812
1 1 543
2 0 6541
6 0 1345
2 0 1522
3 0 1546
4 0 9768
5 1 120
7 0 7543
;
RUN;
我想要一个table,也就是
- 'condition=0'
时的所有观察
- 具有相同 id 的所有观察值的崩溃,当 'condition=1' 具有新列时,包含不同 money 的总和此 id
的 个值
我只能使用 retain 语句来完成第二部分,但我还没有找到包含条件的方法。
/* Sort into ID order */
proc sort data=money out=money2 ;
by id ;
run ;
data money_out ;
set money2 ;
by id ;
retain total . ;
if first.id then total = 0 ; /* If first ID then set total = 0 */
if condition = 0 then output ; /* Output all condition = 0 records */
else do ;
total + money ; /* increment total */
if last.id then do ;
money = total ;
output ; /* Output on last ID record */
end ;
end ;
drop total ;
run ;
Proc sql 也可能是一个解决方案。
proc sql;
create table money_sum as
(select *
from money
where condition = 0
union all
select id, condition, sum(money) as money
from money
where condition = 1
group by id, condition)
order by id;
quit;
现在要做的是分别创建两个集合,然后将它们与集合操作结合起来。
我有一个看起来像这样的数据库:
DATA money;
INPUT id condition money;
CARDS;
1 1 453
5 1 9812
1 1 543
2 0 6541
6 0 1345
2 0 1522
3 0 1546
4 0 9768
5 1 120
7 0 7543
;
RUN;
我想要一个table,也就是
- 'condition=0' 时的所有观察
- 具有相同 id 的所有观察值的崩溃,当 'condition=1' 具有新列时,包含不同 money 的总和此 id 的 个值
我只能使用 retain 语句来完成第二部分,但我还没有找到包含条件的方法。
/* Sort into ID order */ proc sort data=money out=money2 ; by id ; run ; data money_out ; set money2 ; by id ; retain total . ; if first.id then total = 0 ; /* If first ID then set total = 0 */ if condition = 0 then output ; /* Output all condition = 0 records */ else do ; total + money ; /* increment total */ if last.id then do ; money = total ; output ; /* Output on last ID record */ end ; end ; drop total ; run ;
Proc sql 也可能是一个解决方案。
proc sql;
create table money_sum as
(select *
from money
where condition = 0
union all
select id, condition, sum(money) as money
from money
where condition = 1
group by id, condition)
order by id;
quit;
现在要做的是分别创建两个集合,然后将它们与集合操作结合起来。