SAS中文论坛

标题: 想进行一个循环,每次循环取数据集中的一列,怎么表示? [打印本页]

作者: shiyiming    时间: 2009-8-20 14:58
标题: 想进行一个循环,每次循环取数据集中的一列,怎么表示?
我想建一个循环,每次循环从一个数据集中选取一列赋值给新的数据集,然后进行其他数据分析工作,就是说我有一个data1数据集,维数是n*m,每次循环选取一列赋值给新的数据集data2,要循环m次,程序要怎么写,其他语言可以用data[,i]来表示,但sas好像不行,要怎么办?
作者: shiyiming    时间: 2009-8-20 16:22
标题: Re: 想进行一个循环,每次循环取数据集中的一列,怎么表示?
[code:3atehgi1]data a;
        input a $ x y z;
datalines;
a 1 2 3
b 4 5 6
c 7 8 9
d 10 11 12
;

%macro keep_var(dsname);
        options nosymbolgen nomprint;
        %let dsid=%sysfunc(open(&dsname,i));
        %let varnum=%sysfunc(attrn(&dsid,nvars));
        %let varlist=;
        %do i=1 %to &varnum;
           %let varlist=&varlist %sysfunc(varname(&dsid,&i));
        %end;
        %let rc=%sysfunc(close(&dsid));
        %do i=1 %to &varnum;
                options nonotes;
                data ds_part_&i (keep=%scan(&varlist,&i));
                        set &dsname;
                run;
                options notes;
                %put NOTE: *** 已为变量 %scan(&varlist,&i) 创建数据集 ds_part_&i. ***;
        %end;
%mend;

%keep_var(work.a)[/code:3atehgi1]
作者: shiyiming    时间: 2009-8-20 16:51
标题: Re: 想进行一个循环,每次循环取数据集中的一列,怎么表示?
非常感谢,你的程序我正在学习中,但好像不是我要的,这个程序时将一个数据集按照列分成了单个数据集,每个数据集包含原数据集中的一列,但我想要做的是在每次循环中从原数据集中提取出一列数据,构成一个新的数据集,然后利用这个新的数据集进行下面的复杂的数据分析工作,如调用iml,进行混合模型拟合等,然后把每次数据处理的结果存储并导出。这个程序的结果好像每次只是把数据分开了,那我还要加一个循环,来每次调用一个数据集进行数据分析工作。
有没有想其他的程序中的用法,如,一个n*m的数据data,我想表示数据的某一列值,只需要用data(,i)就可以了,那么循环就可以写成:
do i=1 to m;
newdata=data(,i);/*表示取第i列,逗号前面的值代表行,没有就表示所有行,逗号后面的值代表列,表示选择第i列,这里根据循环的次数选择列号,有多少列就进行多少次循环*/
/*一系列的数据分析工作*/
end

谢谢了
作者: shiyiming    时间: 2009-8-20 17:49
标题: Re: 想进行一个循环,每次循环取数据集中的一列,怎么表示?
hopewell 是正确的,而且程序很棒!
%do i=1 %to &varnum;
      options nonotes;
      data ds_part_&i (keep=%scan(&varlist,&i));
         set &dsname;
      run;
/*这里创建了单列的数据集,你可以根据自己的需要写成宏函数*/
/*也可以直接在这里加入 【你的操作】*/
      options notes;
      %put NOTE: *** 已为变量 %scan(&varlist,&i) 创建数据集 ds_part_&i. ***;
   %end;
作者: shiyiming    时间: 2009-8-20 18:26
标题: Re: 想进行一个循环,每次循环取数据集中的一列,怎么表示?
我想搂主可能要iml:
[code:2wc5ti4b]
proc iml;
        use a;
        read all var _num_ into A;
        close a;
        do i=1 to ncol(A);
                newdata=A[,i];
        end;
quit;
[/code:2wc5ti4b]
作者: shiyiming    时间: 2009-8-20 18:33
标题: Re: 想进行一个循环,每次循环取数据集中的一列,怎么表示?
我不是很明白你的需求,不过是不是可以考虑用数组试试,行列转置后把新的一行数据放一个一维数组里(旧的一个变量列),再按DATA步循环就相当于按原数据集的列循环了.
[code:32gypyqi]data raw;
        input v1-v3;
datalines;
1 2 3
4 5 6
7 8 9
10 11 12
;

proc transpose data=raw out=temp prefix=var;
run;

data temp2(keep=new_var1-new_var4);
        set temp;
        array old{*} var1-var4;
        /* 假的操作 */
        array new{*} new_var1-new_var4;
        do i=1 to dim(old);
                new(i)=old(i)+1;
        end;
run;[/code:32gypyqi]
作者: shiyiming    时间: 2009-8-21 11:49
标题: Re: 想进行一个循环,每次循环取数据集中的一列,怎么表示?
谢谢,用2楼的方法问题解决了,




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2