标题: 计算总合! [打印本页] 作者: shiyiming 时间: 2010-9-29 00:17 标题: 计算总合! 请问各位前辈一个问题,现在我想将同日期,同ID,同行动的数量加总起来变成一新的变量(总合),不知道其程序该如何写呢,请各位前辈帮帮我吧!
日期 ID 时间 行动 数量 总合
2008/1/5 1 100101 A 2 56
2008/1/5 1 102201 A 3 56
2008/1/5 1 102456 B 1
2008/1/5 1 105533 A 51 56
2008/1/5 2 110055 A 11 28
2008/1/5 2 112051 A 12 28
2008/1/5 2 132505 A 5 28
2008/1/6 3 133555 B 6
2008/1/6 1 101200 B 41 42
2008/1/6 1 115555 A 55
2008/1/6 1 125455 B 1 42
2008/1/7 2 113311 A 2 5
2008/1/7 2 115555 A 3 5
2008/1/7 3 134455 B 44
2008/1/8 3 105633 A 15
2008/1/8 3 112255 A 5 20
2008/1/8 3 120044 B 6
2008/1/8 1 125444 A 7
2008/1/8 1 133333 A 8 15作者: shiyiming 时间: 2010-9-29 08:38 标题: Re: 计算总合! 没太明白你的规则
开始我以为是把总和的数据拼回原数据集,但发现有些观测的总和是missing; 于是我猜group的观测数等于1的总和值不要; 但问题又来了,对有2条观测的组为什么有些组是2条观测都有总和值,而有些组只有后一条观测有总和值呢?
[code:3275b3eq]data raw;
infile datalines truncover;
input date :yymmdd10. id time $ action $ count sum;
format date yymmdd10.;
datalines;
2008/1/5 1 100101 A 2 56
2008/1/5 1 102201 A 3 56
2008/1/5 1 102456 B 1
2008/1/5 1 105533 A 51 56
2008/1/5 2 110055 A 11 28
2008/1/5 2 112051 A 12 28
2008/1/5 2 132505 A 5 28
2008/1/6 3 133555 B 6
2008/1/6 1 101200 B 41 42
2008/1/6 1 115555 A 55
2008/1/6 1 125455 B 1 42
2008/1/7 2 113311 A 2 5
2008/1/7 2 115555 A 3 5
2008/1/7 3 134455 B 44
2008/1/8 3 105633 A 15
2008/1/8 3 112255 A 5 20
2008/1/8 3 120044 B 6
2008/1/8 1 125444 A 7
2008/1/8 1 133333 A 8 15
;
proc sql;
create table out as
select a.*, b.calculate_count
from raw a left join
(select date, id, action,count(id) as count, sum(count) as calculate_count
from raw
group by date, id, action
having count gt 1) b
on a.date=b.date and a.id=b.id and a.action=b.action
order by date, time;
quit;[/code:3275b3eq]作者: shiyiming 时间: 2010-9-29 14:50 标题: Re: 计算总合! 不好意思,我可能没说清楚。我主要的意思是要将有相同日期、ID和行动的值全部加总起来,所以说在相同日期、ID和行动的观测值其总合皆相同(皆为其个别数量相加总),但若没有同日期、ID和行动的观测值的话(话句话说,当天只有本身一笔时),就不作相加的动作,故为missing。(当然一开始是没有总合这一项的,因为这是我最后想求得的答案)
也因为这样,我不知该如何进行,请各位前辈多多帮忙,谢谢!作者: shiyiming 时间: 2010-9-29 17:47 标题: Re: 计算总合! 两边都是复制粘帖......汗啊作者: shiyiming 时间: 2010-9-29 17:56 标题: Re: 计算总合! <!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->作者: shiyiming 时间: 2010-10-5 16:57 标题: Re: 计算总合! proc sort data=yourdata; by date ID action; run;
proc means data=yourdata noprint; by date ID action; var quantity; output out=outdata (drop=_type_) sum=sum; run;
data outdata; set outdata; if _freq_=1 then sum=.; run;
data finaldata; merge yourdata outdata(drop=_freq_); by date ID action; run;作者: shiyiming 时间: 2010-10-20 04:13 标题: Re: 计算总合! [quote:2la9rukm]data a;
input date : yymmdd10. id $ time act $ num;
format date yymmdds10.;
cards;
2008/1/5 1 100101 A 2 56
2008/1/5 1 102201 A 3 56
2008/1/5 1 102456 B 1
2008/1/5 1 105533 A 51 56
2008/1/5 2 110055 A 11 28
2008/1/5 2 112051 A 12 28
2008/1/5 2 132505 A 5 28
2008/1/6 3 133555 B 6
2008/1/6 1 101200 B 41 42
2008/1/6 1 115555 A 55
2008/1/6 1 125455 B 1 42
2008/1/7 2 113311 A 2 5
2008/1/7 2 115555 A 3 5
2008/1/7 3 134455 B 44
2008/1/8 3 105633 A 15
2008/1/8 3 112255 A 5 20
2008/1/8 3 120044 B 6
2008/1/8 1 125444 A 7
2008/1/8 1 133333 A 8 15
;
run;
proc sql;
create table b as
select *,ifn(cnt>1,sum(num),.) as total_num
from (select *,count(*) as cnt from a group by date,id,act)
group by date,id,act
order by date,id,act;
quit;[/quote:2la9rukm]