楼主: lizhewenbei
1252 14

请教大牛,如何做出如下的统计 [推广有奖]

11
lizhewenbei 学生认证  发表于 2016-10-1 16:37:05 |只看作者 |坛友微信交流群
sas9.4 发表于 2016-9-25 20:27
data source;
infile cards missover;
input @1 name $        _2010 $        _2011         $ _2012  ...
您这个方法很简洁,感谢!!

使用道具

12
lizhewenbei 学生认证  发表于 2016-10-1 16:45:19 |只看作者 |坛友微信交流群
流水不朽 发表于 2016-9-24 16:14
给种简单的方法
假设tmp 数据集除了 结果变量result 外的数据集
data        tmp_01(keep=num name col_w)
我将原始数据代入,好像跑不出来结果啊,烦请您帮我看看,可以吗?

data tmp;
infile cards missover;
input @1 name $ col_2010 $       col_2011   $      col_2012   $     col_2013 $ ;
cards;
邹**        A车间        A车间        A车间        
林**        C车间        C车间        C车间        C车间
林**        C车间        C车间        D车间        C车间
林**        C车间        C车间        C车间        C车间
戴**        B车间                        
王**        B车间                        
王*        B车间        B车间        B车间        B车间
高*        F车间        E车间               
江**        E车间        E车间        E车间        
钱*        F车间                        
张*        E车间        E车间               
廖*        F车间        A车间               
廖*1        A车间        A车间        H车间        
李*        E车间        G车间        A车间        A车间
王*        E车间        E车间        I车间        
臧*        E车间        E车间        E车间        
;


data        tmp_01(keep=num name col_w)
        tmp(keep=num name col_2010-col_2013)
;
    set tmp;
       format col_ $40.;
        col_=catx(',',col_2010,col_2011,col_2012,col_2013);
        n=countw(col_,',');
        num=put(_n_,z2.);
        do i=1 to n by 1;
                col_w=scan(col_,i,col_);
        end;
run;
proc sort data=tmp_01 nodupkey;by num name col_w;run;
data        tmp_02;
    set tmp_01;
     by num name col_w;
     retain result;
     if first.num then
        result=1;
   else result=result+1;
     if last.num;
run;
proc sql;
        create table result_ as
        select a.*
              ,b.result
          from tmp a
               left outer join
               tmp_02 b
            on a.num=b.num
;
quit;

使用道具

13
lizhewenbei 学生认证  发表于 2016-10-1 16:46:30 |只看作者 |坛友微信交流群
sas9.4 发表于 2016-9-25 20:27
data source;
infile cards missover;
input @1 name $        _2010 $        _2011         $ _2012  ...
请问您的这种方法,能否将结果作为一列,放入数据集source?目前的状态是,在结果查看器中看到其结果啊。

使用道具

14
lizhewenbei 学生认证  发表于 2016-10-1 16:56:56 |只看作者 |坛友微信交流群
wwang111 发表于 2016-9-19 14:43
您好!我按照您的代码做了尝试,结果有点不太对,烦请您指正!
data test;
infile cards missover;
input @1 name $ yr2010 $       yr2011   $      yr2012   $     yr2013 $ ;
cards;
邹**        A车间        A车间        A车间        
林**        C车间        C车间        C车间        C车间
林**        C车间        C车间        D车间        C车间
林**        C车间        C车间        C车间        C车间
戴**        B车间                        
王**        B车间                        
王*        B车间        B车间        B车间        B车间
高*        F车间        E车间               
江**        E车间        E车间        E车间        
钱*        F车间                        
张*        E车间        E车间               
廖*        F车间        A车间               
廖*1        A车间        A车间        H车间        
李*        E车间        G车间        A车间        A车间
王*        E车间        E车间        I车间        
臧*        E车间        E车间        E车间        
;


data wanted; set test;
array yr{*} yr2010 - yr2013;
array temp{*} $ temp1-temp4;
do i=1 to dim(temp);
  temp{i}=yr{i};
end;

call sortc(of temp1-temp4);
do j=1 to dim(temp)-1;
  if temp{j} ne temp{j+1} and temp{j} ne '' then count+1;
end;

drop temp: i j;
run;

使用道具

15
lizhewenbei 学生认证  发表于 2016-10-1 17:05:07 |只看作者 |坛友微信交流群
prince315 发表于 2016-9-19 13:53
data out;
set in;
array yr{4} $ yr_2010 - yr_2013;
您好!我的技术比较差,不知道为什么复制不了,请您指正
data in;
infile datalines missover;
input @1 name $ yr2010 $ yr2011 $ yr2012 $ yr2013 $;
cards;
邹** A车间 A车间 A车间
林** C车间 C车间 C车间 C车间
林** C车间 C车间 D车间 C车间  
林** C车间 C车间 C车间 C车间  
戴** B车间     
王** B车间     
王*  B车间 B车间 B车间 B车间  
高*  F车间 E车间   
江** E车间 E车间 E车间   
钱*  F车间   
张*  E车间 E车间   
廖*  F车间 A车间
廖*  A车间 A车间 H车间  
李*  E车间 G车间 A车间 A车间
王*  E车间 E车间 I车间   
臧*  E车间 E车间 E车间  
;
run;


data out;
set in;
array yr{4} yr2010−yr2013;array tmp4 tmp1-tmp4;
do i = 1 to 4; tmp = yr; end; /*临时数值,不改变原值;也可在原值上操作后,只保留最终数值*/

/*将重复值置空*/
do i = 1 to 3;
   do j=i+1 to 4;
       if tmp[j] = "" then continue;
       else if tmp[j]=tmp then tmp[j]="";
   end;
end;

count = 4-cmiss(of tmp1 - tmp4); /*统计非空字段数,即为不重复字段数量*/
drop tmp1-tmp4 i j;
run;

使用道具

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

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

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

GMT+8, 2024-4-19 23:17