SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 872|回复: 6
打印 上一主题 下一主题

计算总合!

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-9-29 00:17:03 | 只看该作者

计算总合!

请问各位前辈一个问题,现在我想将同日期,同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
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-9-29 08:38:44 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-9-29 14:50:05 | 只看该作者

Re: 计算总合!

不好意思,我可能没说清楚。我主要的意思是要将有相同日期、ID和行动的值全部加总起来,所以说在相同日期、ID和行动的观测值其总合皆相同(皆为其个别数量相加总),但若没有同日期、ID和行动的观测值的话(话句话说,当天只有本身一笔时),就不作相加的动作,故为missing。(当然一开始是没有总合这一项的,因为这是我最后想求得的答案)
也因为这样,我不知该如何进行,请各位前辈多多帮忙,谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2010-9-29 17:47:35 | 只看该作者

Re: 计算总合!

两边都是复制粘帖......汗啊
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2010-9-29 17:56:32 | 只看该作者

Re: 计算总合!

<!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2010-10-5 16:57:28 | 只看该作者

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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2010-10-20 04:13:52 | 只看该作者

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]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-3 20:17 , Processed in 0.120557 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表