楼主: dddyiersan
13487 15

求组:多列数据合并一列,怎么操作? [推广有奖]

11
yongyitian 发表于 2013-4-11 23:48:45
Eternal0601 发表于 2013-4-11 12:26
貌似 output语句应该放在 end语句 跟 drop语句 中间
Thanks, good debugger, peer.

不好意思 Output 语句是修改上面的程序时留下的,这里不需要。

虽然结果都是一样的,但在这段程序中使用output但会产生误解。

12
suizh 发表于 2013-4-11 23:48:48
data a;
input x1 1-2  x2 3-10 x3 11-19  x4 20-28 ;
cards;
                       1
        1               
        1               
1                        
        1               
                1        
                        1
1                        
1                        
                        1
                        1
                        1
        1               
                        1
                        1
                        1
                1        
        1               
                1        
        1               
                        1

;
run;
data b;
set a;
x=sum(of x1,x2*2,x3*3,x4*4);
run;

13
qinly10 发表于 2013-5-1 20:51:01
楼上各位没有理解楼主的意思呀,呵呵
写了个宏,能够解决你的问题。
我假定数据a有三题选择题,题号开头分别为q01,q02和q03,每一题的选项数目分别是4、5和3,在引用宏的时候,要按照每一题的选项数写入系统变量里,就像我对宏的引用:%mult(4,5,3);。你有50题的话,就把这50题的选项数写到宏引用句子里。
比较尴尬的是,你的数据集命名规则没统一,前面还是q010的,后面就成了q04了,少了一个0。这个你就改改名字吧,统统改成q0n的形式。
data a;
input id $ q011-q014 q021-q025 q031-q033;
datalines;
001 1 . . . 1 . . . . 1 . .
002 . 1 . . . . 1 . . 1 . .
003 . . 1 . . 1 . . . . 1 .
004 . . . 1 . . . . 1 . . 1
;
run;
%macro mult / parmbuff;
%if &syspbuff ne %then %do;
    %let i=1;
    %let ii=%scan(&syspbuff,&i);
    %do %while(&ii ne);
    data c;
      set a;
      %do j=1 %to 3;/*一共三题,故循环至3*/
           %let j=%sysfunc(cats(0,&j));
        array q&j{&ii} q&j.1-q&j.ⅈ
        do k=1 to ⅈ
          if q&j{k}=1 then q&j{k}=k;
        end;
                sq&j=sum(of q&j.1-q&j.&ii);
                drop q&j.1-q&j.&ii k;
      %let i=%eval(&i+1);
      %let ii=%scan(&syspbuff,&i);
    %end;
    run;
    %end;
  %end;
%mend;
%mult(4,5,3);



下面这个宏也是可以的:
%macro mult / parmbuff;
%if &syspbuff ne %then %do;
    %let i=1;
    %let ii=%scan(&syspbuff,&i);
    %do %while(&ii ne);
    data c;
      set a;
      %do j=1 %to 3;/*一共三题,故循环至3*/
           %let j=%sysfunc(cats(0,&j));
             %do iii=1 %to ⅈ
               if q&j.&iii= 1 then sq&j=&iii;
             %end;
      drop q&j.1-q&j.ⅈ       
      %let i=%eval(&i+1);
      %let ii=%scan(&syspbuff,&i);
    %end;
    run;
    %end;
  %end;
%mend;
%mult(4,5,3);

14
rdwalk 发表于 2013-5-1 21:12:29
学习

15
ariman911 发表于 2013-5-1 23:34:48
data a;
set a;
array xx{4} x1-x4;
do i = 1 to dim(xx);
if xx{i}^=. then j=i;
end;
drop i;
proc print;
run;

16
mzyoung 在职认证  发表于 2014-3-27 10:00:28
xueyinchina 发表于 2013-4-11 09:41
如果是excel格式的数据,可以用&符号,比如公式“=C3&D3&E3”,就把这三列合并为一列了
perfect,三克油

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

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