楼主: 小鳄鱼a
1069 2

求助帖子 [推广有奖]

  • 6关注
  • 10粉丝

学科带头人

3%

还不是VIP/贵宾

-

威望
0
论坛币
125 个
通用积分
0.0040
学术水平
40 点
热心指数
45 点
信用等级
43 点
经验
32801 点
帖子
1185
精华
0
在线时间
1539 小时
注册时间
2009-7-16
最后登录
2018-10-5

600论坛币
发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发

最佳答案

jl60156 查看完整内容

proc sql; create table have1 as select sum(n) as n, * from have group by id, year,half, g; create table have2 as select distinct * from have1 order by year,half,id, g ; quit; data have2; set have2; t=year*10+half*5; run; proc transpose data=have2 ou ...
关键词:求助帖
沙发
jl60156 发表于 2015-6-3 11:38:48 |只看作者 |坛友微信交流群
proc sql;
        create table have1 as
                select sum(n) as n, *
                from have
                group by id, year,half, g;
        create table have2 as
                select  distinct *
                from have1
                        order by year,half,id, g ;
quit;
data have2;
        set have2;
        t=year*10+half*5;
run;
proc transpose data=have2 out=trans(drop=_name_);
        by t id;
        id g;
        var n;
run;
proc sql;
  select distinct id, count(distinct id) into :ids separated by ' ', :idn
  from trans
quit;
ods output nlevels=dummy;
proc freq data=trans levels;
run;
%macro want();
%do id=1 %to &idn;
%let idk=%scan(&ids,&id,%str( ));
%put &idk;
proc sql;
  select distinct t, count(distinct t) into :ts separated by ' ', :tn
  from trans
  where id=&idk;
quit;
%do t=1 %to &tn;
%let tk=%scan(&ts,&t,%str( ));
ods select nlevels;
ods output nlevels=nlev&id&t;
proc freq data=trans(where=(id=&idk and t=&tk) ) levels;
run;
ods output close;      
proc sql noprint;
  select strip(tablevar) ,strip(tablevar) into :vars separated by ' ', :varsd separated by ','
  from nlev&id&t
  where nnonmisslevels ne 0 and tablevar not in ('id','t');
quit;
%let nvar=%sysfunc(countw(&vars,' '));
data factor1(keep=&vars id t %do j=1 %to &nvar;
      %let k=%scan(&vars,&j,%str( ));
                rename=(&k=_&k)
    %end;);
        set trans;

           %do j=1 %to &nvar;
      %let k=%scan(&vars,&j,%str( ));
      if missing(&k) then &k=0;
      if t=&tk then &k=-(&k);
           %end;

     where (id eq &idk and &tk<=t<=%eval(&tk+5));
run;
proc sql;
     create table factor2 as
           select  %do j=1 %to &nvar;%let k=%scan(&vars,&j,%str( ));
                                     abs(sum(_&k)) as _&k, %end; id
           from factor1
           group by id;
quit;
data factor(drop=id);
     set factor2;
     t=&tk; output;
     t=%eval(&tk+5); output;
run;
data t(keep=&vars id t);
        merge trans(in=in where=(id ne &idk and &tk<=t<=%eval(&tk+5))) factor;
                     by t;
    %do j=1 %to &nvar;
      %let k=%scan(&vars,&j,%str( ));
                        if missing(&k) then &k=0;
                        if t=&tk then &k=-(&k);
                                                                &k=&k/_&k;
    %end;
           if in;
run;
proc sql;
  select  count(distinct t) into :maxt
  from t;
quit;
%if &maxt eq 2 %then %do;
proc sql;
        create table t&t as
                select sum(sum(&varsd)) as p,&idk as id,%eval(&tk+5) as t
                from t;
quit;
%end;
%else %do;
data t&t;
run;
%end;
%end;
data tid&id;
        set %do t=1 %to &tn; t&t %end;;
run;
%end;
data tall;
        set %do id=1 %to &idn;  tid&id %end;;
                year=floor(t/10)-(mod(t,10)=0);
                half=mod(t/5,2)+(mod(t/5,2)=0)*2;
run;
proc sort data=have;
        by id year half;
run;
proc sort data=tall;
        by id year half;
run;
data want;
        merge have(in=a) tall(drop=t);
        by id year half;
        if a;
run;
%mend;      

%want;
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 50 热心帮助其他会员
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

总评分: 论坛币 + 55  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

使用道具

藤椅
zhengbo8 发表于 2015-6-3 17:05:43 |只看作者 |坛友微信交流群
{:3_44:}
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

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

使用道具

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

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

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

GMT+8, 2024-4-19 11:09