SAS中文论坛

标题: 计算总合! [打印本页]

作者: 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&gt;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]




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2