楼主: zhufengyuan
1578 8

[原创博文] 求平均周期 [推广有奖]

  • 0关注
  • 0粉丝

硕士生

57%

还不是VIP/贵宾

-

威望
0
论坛币
263 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
644 点
帖子
52
精华
0
在线时间
272 小时
注册时间
2009-9-8
最后登录
2022-1-28

楼主
zhufengyuan 发表于 2012-8-10 15:30:13 |AI写论文
5论坛币
number                 date
600203                2012-01-01
600203                2012-01-15
600204                2012-01-14
600205                2012-01-04
600205                2012-01-19
600206                2012-01-03
600206                2012-01-28
600207                2012-01-05
600208                2012-01-09
;

要求输出结果:

number                 date1                  date2            date3           date4     ……  平均周期
600203                2012-01-01      2012-01-15
600204                2012-01-14
600205                2012-01-04      2012-01-19
600206                2012-01-03      2012-01-28
600207                2012-01-05
600208                2012-01-09
;
平均周期=mean(date i - date i-1);

尝试用宏编程如下,但是系统报错。

%macro xx;
data a.tt12;
set a.tt11;
do i=4 to &n. by 1;
array col col_1-col_n;
averagezhouqi=mean(col_(n)-col_(n-1));
end;
run;
%mend;
%xx;

请高手指点迷津。
关键词:求平均 average Number array Macro number

沙发
YueweiLiu 发表于 2012-8-10 15:30:14
  1. proc transpose data=have out=tmp(drop=_name_) prefix=date;
  2.         by number;
  3.         var date;
  4. run;
  5. data want;
  6.         set tmp;
  7.         sum=0;
  8.         flag=0;
  9.         array datetmp[*] date:;
  10.         do i=2 to dim(datetmp);
  11.                 if datetmp[i]=. then continue;
  12.                 else do;
  13.                         sum+(datetmp[i]-datetmp[i-1]);
  14.                         flag+1;
  15.                         mean=sum/flag;
  16.                 end;
  17.         end;
  18.         drop i sum flag;
  19. run;
复制代码

藤椅
binyehan 发表于 2012-8-10 16:42:04
data a;
length date $12.;
input number $ date $  @;
cards;
600203                2012-01-01
600203                2012-01-15
600203                2012-01-25
600203                2012-01-28
600204                2012-01-14
600205                2012-01-04
600205                2012-01-19
600206                2012-01-03
600206                2012-01-13
600206                2012-01-28
600207                2012-01-05
600208                2012-01-09
;
run;
proc sort data=a out=b;
        by number date;
run;
data c;
    set b;
        date=compress(cats(date),,"kd");
        by number;
        retain flag;
        if first.number then flag=0;
        flag+1;
        if flag=1 then date1=date;
        if flag=2 then date2=date;
        if flag=3 then date3=date;
        if flag=4 then date4=date;
run;
data d1(drop=date2 date3 date4 flag);
        set c;
        if date1^="";
run;
data d2(drop=date1 date3 date4 flag);
        set c;
        if date2^="";
run;
data d3(drop=date1 date2 date4 flag);
        set c;
        if date3^="";
run;
data d4(drop=date1 date2 date3 flag);
        set c;
        if date4^="";
run;
data d5;
        merge d1 d2 d3 d4;
        by number;
run;

data final;
        set d5;
        by number;
        averagezhouqi=mean(of date1-date4);
        ave=int(averagezhouqi);
        format ave ddmmyy10.;
run;

看看行不行,不知道你具体要求的mean是什么情况。

板凳
zhufengyuan 发表于 2012-8-10 17:01:59
mean是求平均值,还有date有96个,所以一定要写循环。
每天进步一点点~~~

报纸
zhufengyuan 发表于 2012-8-10 17:02:38
binyehan 发表于 2012-8-10 16:42
data a;
length date $12.;
input number $ date $  @;
mean是求平均值,还有date有96个,所以一定要写循环。
每天进步一点点~~~

地板
maidenhan 发表于 2012-8-10 17:33:24
data tt11;
        format number $10.
                   edit_date date9.
                   date $10.;
        input number $ date $;
        edit_date = input(date, yymmdd10.);
cards;
600203 2012-01-01
600203 2012-01-15
600203 2012-02-01
600204 2012-01-14
600205 2012-01-04
600205 2012-01-19
600206 2012-01-03
600206 2012-01-28
600207 2012-01-05
600208 2012-01-09
;run;
proc sql;
        select max(cnt) into: n
                from (select number, count(*) as cnt
                        from tt11
                        group by 1);
quit;
proc sort data = tt11;
        by number edit_date;
run;
data tt12(drop = i id edit_date date);
        array col{&n.};
        retain col;
        set tt11;
        by number;
        if first.number then do;
                do i = 1 to &n.;
                        col{i} = '';
                end;
                id = 0;
        end;
        id + 1;
        col{id} = edit_date;
        if last.number then do;
                mean_val = ( col{id}-col{1} ) / id;
                output;
        end;
run;

7
hcydlee 发表于 2012-8-10 17:36:46
  1. 同一个ID下有很多个visit,然后计算每个visit之间的间隔是多少,然后计算这个间隔的平均值。下楼提供代码
复制代码
80 字节以内
不支持自定义 Discuz! 代码

8
hcydlee 发表于 2012-8-10 17:40:54
hcydlee 发表于 2012-8-10 17:36
  1. data a ;
  2. informat date yymmdd10.;
  3. input  number $6.  date;
  4. format date ddmmyy9.;
  5. cards;
  6. 600203                2012-01-01
  7. 600203                2012-01-15
  8. 600204                2012-01-14
  9. 600205                2012-01-04
  10. 600205                2012-01-19
  11. 600206                2012-01-03
  12. 600206                2012-01-28
  13. 600207                2012-01-05
  14. 600208                2012-01-09
  15. ;
  16. run;
  17. proc sort data=a;
  18. by number date;
  19. run;
  20. data a;
  21.         set a;
  22.         by number;
  23.         if first.number then index=1;
  24.         else index+1;
  25. run;

  26. proc sql noprint;
  27.         select max(index) into : mm
  28.         from a;
  29. run;


  30. proc transpose data=a prefix=date out=b;
  31.         by number;
  32.     id index;
  33.         var date;
  34. run;

  35. data c ;
  36. set b;
  37. %let mm=%left(&mm);
  38. array dat{*} date1-date&mm;
  39. array change{%eval(&mm-1)};
  40. do i=2 to dim(dat);
  41.         change{i-1}=dat(i)-dat(i-1);
  42. end;
  43. drop i;
  44. run;

  45. data final;
  46.         set c;
  47.     avecir=mean(of change:);
  48. run;
复制代码
80 字节以内
不支持自定义 Discuz! 代码

9
zhufengyuan 发表于 2012-8-13 09:23:28
hcydlee 发表于 2012-8-10 17:40
程序试过了,可以跑的。多谢各位!~~~~
每天进步一点点~~~

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 01:33