楼主: shmilycn
1567 7

[原创博文] 计数问题 [推广有奖]

  • 0关注
  • 0粉丝

大专生

35%

还不是VIP/贵宾

-

威望
0
论坛币
31 个
通用积分
0
学术水平
1 点
热心指数
1 点
信用等级
0 点
经验
312 点
帖子
23
精华
0
在线时间
74 小时
注册时间
2008-8-2
最后登录
2015-9-3

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
有一组数据如下:
x     y
1     5.5
1     4
1     7
1     -5.5
1     -3
1      9
需要进行计数和求和,要得到的计数结果是3,也就是说绝对值相等的两行数据抵消,其他正数记1,求和无所谓。
谢谢解答!!!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:绝对值 无所谓 绝对值

沙发
freerunning_sky 在职认证  发表于 2012-3-5 22:32:44 |只看作者 |坛友微信交流群
  1. data a;
  2.         input x y;
  3.         cards;
  4.         1 5.5
  5.         1 4
  6.         1 7
  7.         1 -5.5
  8.         1 -3
  9.         1 9
  10.         ;
  11. run;

  12. data b;
  13.         set a;
  14.         z=abs(y);
  15.         if y<0 then num=-1;else
  16.         if y>0 then num=1;else
  17.         num=0;
  18. run;

  19. proc summary data=b;
  20.         class x z;
  21.         var num;
  22.         output out=c(drop=_type_ _freq_) sum=;
  23. run;

  24. proc sql noprint;
  25.         create table d as
  26.         select x,sum(abs(num)) as total from c
  27.         where x~=. & z~=.
  28.         group by x
  29.         ;
  30. quit;
复制代码
土方法。。

使用道具

藤椅
maximum 发表于 2012-3-5 22:40:26 |只看作者 |坛友微信交流群
不得不说,SAS将简单问题复杂化,很***。SAS就是狗屎软件。

使用道具

板凳
456852 发表于 2012-3-5 22:48:34 |只看作者 |坛友微信交流群
先取绝对值,sort nodupkey一下,再计数。

使用道具

报纸
jingju11 发表于 2012-3-6 04:02:15 |只看作者 |坛友微信交流群
  1. data _null_;
  2.         set a end =Eof;
  3.         array t[1000] _temporary_; *array dimension should be >= obs in dataset;
  4.         t[_n_] =y;
  5.         if t[_n_] and _n_ >1 then do i =1 to _n_-1;
  6.                 if t[_n_] =-t[i] then do;
  7.                         call missing(t[_n_], t[i]);
  8.                         leave;
  9.                 end;
  10.         end;
  11.         if Eof then do;
  12.                 do i =1 to _n_;
  13.                         if t[i] >0 then s ++1;
  14.                 end;
  15.                 put s=;
  16.         end;
  17. run;
复制代码
My pc was very slow for this code. you can try it.
Jingju

使用道具

地板
shmilycn 发表于 2012-3-6 17:44:57 |只看作者 |坛友微信交流群
非常感谢各位的回复!
@freerunning_sky:土办法试过了很有效,但计数为4,我需要等于3,所以如下
data d;
set c;
if num < 0 then num = 0;
run;

proc summary data=d nway;
        class x;
        output out=e(drop=_type_ _freq_) sum(num)=num;
run;

@Jingju: 你的方法我还没试,先谢过!

写这个程序是为了解决一个实际中的问题,在一个公司的销售数据中有正营业额和负营业额,负的情况就是退货。退货有两种,全退和部分退。营业额的统计可以求和算出,但是销售的次数就要根据情况做个算法使得统计数据尽量真实,它会影响到平均的营业额。在全退的情况下,正负销售额都不算次数,部分退货时退货不算销售次数。因为无法辨别某个退货是某次销售的全退,还是另一次销售的部分退,所以确定的简单算法就是只要找到绝对值相同的那个退货就算全退,找不到就算部分退。复杂一点就要按日期顺序或者再跟货品数据联系起来确定。

使用道具

7
jjtww 发表于 2012-3-6 19:31:18 |只看作者 |坛友微信交流群
楼主看看,这个
data a;
        input x y;
                if y>=0 then z=1;
                if y<0 then z=0;
                y=abs(y);
        cards;
        1 5.5
        1 4
        1 7
        1 -5.5
        1 -3
        1 9
        ;
run;

proc sort data=a;
  by y;
run;

data a;
retain s;
   set a;
   by y;
   if first.y and last.y then s+z;
   keep x y s;
run;

使用道具

8
sunset1986 发表于 2012-3-7 13:03:04 |只看作者 |坛友微信交流群
thx for sharing
An honest tale speeds best being plainly told.
Cheers!

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 02:29