楼主: jolterheadmmtt
2144 8

[问答] 关于移动求和的问题??? [推广有奖]

  • 8关注
  • 2粉丝

硕士生

50%

还不是VIP/贵宾

-

威望
0
论坛币
122 个
通用积分
0.0067
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
3519 点
帖子
154
精华
0
在线时间
106 小时
注册时间
2012-9-19
最后登录
2014-9-3

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
A  DATE1  0
A  DATE2  0
A  DATE3  1
A  DATE4  0
A  DATE5  1
A  DATE6  0
B  DATE1  0
B  DATE2  1
   ……

有如上的数据,第一列表示每个作业,第二列是日期,第三列是是否完成(0表示否),现在我想知道,某一日期前,该作业完成的次数,以及这次完成到下次完成中间有多少次失败,这个code我该怎么写呢?请哪位同学老师指点一下??

二维码

扫码加我 拉你入群

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

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

关键词:date code ATE ODE COD

沙发
yongyitian 发表于 2013-7-7 02:10:18 |只看作者 |坛友微信交流群
  1. data a1;
  2.    string = 'ABCDEFGHIJK';
  3.     do i = 1 to 100;
  4.          j = int(ranuni(1)*5) +1;
  5.      course = substr(string, j,1);
  6.        date = i + '01jan2013'd;
  7.         outcome = ( uniform( 12345 ) >= 0.5   );     
  8.        output;
  9.    end;
  10.     format date yymmdd10.;
  11.      drop i j string;
  12. run;

  13. proc sort data=a1 out = a2;
  14.    by course date;
  15. run;

  16. data a3;
  17.     set a2;
  18.     by course;
  19.       if first.course then do;
  20.         Npass = 0; Nfail = 0;
  21.       end;
  22.         if outcome = 1 then do;
  23.            Npass+1;
  24.            Nfail =0;
  25.         end;
  26.         if outcome = 0 then Nfail +1;
  27. run;
复制代码

使用道具

yongyitian 发表于 2013-7-7 02:10
真的是太感谢了,我还想再问一个,是Npass这一列,如果今天完成了,outcome是1,如果我只想知道今天之前完成多少次,而不包括今天的结果呢

使用道具

板凳
yongyitian 发表于 2013-7-7 10:00:51 |只看作者 |坛友微信交流群
jolterheadmmtt 发表于 2013-7-7 09:47
真的是太感谢了,我还想再问一个,是Npass这一列,如果今天完成了,outcome是1,如果我只想知道今天之前完 ...
  1. /* this is modified version */
  2. data a31;
  3.     set a2;
  4.     by course;
  5.        if first.course then do;
  6.         Npass = 0;  Nfail = 0;
  7.         NpassT = 0; NfailT=0;
  8.       end;
  9.         if outcome = 1 then do;
  10.            Npass = NpassT;  NpassT+1;  
  11.            Nfail = NfailT;  NfailT =0;
  12.         end;
  13.         if outcome = 0 then do;
  14.             NfailT +1;
  15.             Nfail = NfailT;
  16.             Npass = NpassT;
  17.          end;
  18.       * drop NpassT NfailT ;
  19. run;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
jolterheadmmtt + 1 + 1 + 1 真心感谢

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

yongyitian 发表于 2013-7-7 10:00
谢谢!这就是我想要的,可是有个问题我不懂,不用retain也可以达到这个自动累加的效果?

使用道具

地板
yongyitian 发表于 2013-7-7 10:25:07 |只看作者 |坛友微信交流群
jolterheadmmtt 发表于 2013-7-7 10:12
谢谢!这就是我想要的,可是有个问题我不懂,不用retain也可以达到这个自动累加的效果?
因为每一次循环都给这些变量赋了新值。
已有 1 人评分学术水平 收起 理由
jolterheadmmtt + 1

总评分: 学术水平 + 1   查看全部评分

使用道具

7
jolterheadmmtt 发表于 2013-7-8 12:52:53 |只看作者 |坛友微信交流群
yongyitian 发表于 2013-7-7 10:25
因为每一次循环都给这些变量赋了新值。
明白了 太感谢了

使用道具

8
yongyitian 发表于 2013-7-9 10:58:05 |只看作者 |坛友微信交流群
jolterheadmmtt 发表于 2013-7-7 10:12
谢谢!这就是我想要的,可是有个问题我不懂,不用retain也可以达到这个自动累加的效果?
补充一点

如果一个变量 var 以 var+...; 的形式出现在程序中. 这个变量就叫累加或求和变量。 累加或求和变量在数据步中是自动retain 的。不需要用retain 语句来定义. 如四楼中的NpassT 和 NfailT. 每一次循环时, 如果不重新赋值,NpassT+1; NfailT+1; 就会使原来的值增加一,从而计算出 pass 和 fail 的次数.


而 Npass 和 Nfail 不是累加变量,但每一次循环都被赋于了新的值, 所以也不需要 用retain. 如果每一次循环时 Npass 和 Nfial 不被赋于新值, 那末Npass 和 Nfail的值就会为缺矢。

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
jolterheadmmtt + 1 + 1 + 1 非常清晰热心,很好

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

9
jolterheadmmtt 发表于 2013-7-9 11:41:55 |只看作者 |坛友微信交流群
yongyitian 发表于 2013-7-9 10:58
补充一点

如果一个变量 var 以 var+...; 的形式出现在程序中. 这个变量就叫累加或求和变量。 累加或求 ...
真的太感谢你了,讲的很清楚也很热心,谢谢!

使用道具

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

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

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

GMT+8, 2024-5-11 01:24