SAS中文论坛

标题: 请问各位高手如何实现下面数据处理的程序,附有结果 [打印本页]

作者: shiyiming    时间: 2010-5-25 12:45
标题: 请问各位高手如何实现下面数据处理的程序,附有结果
目的:是通过前面的2列输出后面的2列
算法:out1是级别中同一类别对应的在flag中年的和,如16对应的是4个一,out1=4,15后面对应的是2个1,out1=2
          out2 是级别中同一类别的个数,比如级别16有4个,级别15有4个,级别12有6个
    先谢谢啦

级别        flag                out1        out2
16        1                4        4
16        1                4        4
16        1                4        4
16        1                4        4
15        0                2        4
15        1                2        4
15        1                2        4
15        0                2        4
12        0                3        6
12        0                3        6
12        0                3        6
12        1                3        6
12        1                3        6
12        1                3        6
10        1                2        4
10        0                2        4
10        0                2        4
10        1                2        4
8        0                2        3
8        1                2        3
8        1                2        3
7        0                2        3
7        1                2        3
7        1                2        3
6        0                2        6
6        0                2        6
6        0                2        6
6        1                2        6
6        1                2        6
6        0                2        6
4        0                0        3
4        0                0        3
4        0                0        3
3        0                1        2
3        1                1        2
2        0                1        3
2        0                1        3
2        1                1        3
1        0                0        2
1        0                0        2
作者: shiyiming    时间: 2010-5-25 13:46
标题: Re: 请问各位高手如何实现下面数据处理的程序,附有结果
[code:mr23ugi5]data raw(index=(level));
        input level flag std1 std2;
datalines;
16 1 4 4
16 1 4 4
16 1 4 4
16 1 4 4
15 0 2 4
15 1 2 4
15 1 2 4
15 0 2 4
12 0 3 6
12 0 3 6
12 0 3 6
12 1 3 6
12 1 3 6
12 1 3 6
;

data temp1;
        out1=0;
        out2=0;
        do _n_=1 by 1 until(last.level);
                set raw;
                by level;
                out1+flag;
                out2+1;
        end;
        do until(last.level);
                set raw;
                by level;
                output;
        end;
run;

proc sql;
        create table temp2 as
                select *,sum(flag) as out1,count(*) as out2
                        from raw
                        group by level
                        order by level desc;
quit;[/code:mr23ugi5]
作者: shiyiming    时间: 2010-5-26 10:22
标题: Re: 请问各位高手如何实现下面数据处理的程序,附有结果
hopewell真是厉害啊,如此短的时间里就提出了2种方法,而且非常简洁。非常感谢啊
但是还有如下几个问题,希望hopewell解答


1、index=(level),是为了后面使用last.level吗,

是不是变量level就变成一个全局变量了,类似与宏?
2、last.level是同一类的观测数吗?

3、在第一种方法中我看到顺序有原来的降序,变成了升序,自己试着修改也没有成?
在里面加order by level desc;也没成,在这里面改还有其他方法吗??
(后来想可以把temp1中的数据排序一下就可以了呵呵)
作者: shiyiming    时间: 2010-5-26 12:59
标题: Re: 请问各位高手如何实现下面数据处理的程序,附有结果
[quote:3qvgp1xd]1、index=(level)[/quote:3qvgp1xd]是为了使用by组,进而使用by组的last.variable,那是个索引

[quote:3qvgp1xd]2、last.level是同一类的观测数吗?[/quote:3qvgp1xd]不是,是个by组的临时变量,每个by组的最后一个观测的last.variable值为1,其他为0

[quote:3qvgp1xd]3、在第一种方法中我看到顺序有原来的降序,变成了升序[/quote:3qvgp1xd]在by statement中加descending, order by只能用在proc sql
[code:3qvgp1xd]data temp1;
   out1=0;
   out2=0;
   do _n_=1 by 1 until(last.level);
      set raw;
      by descending level;
      out1+flag;
      out2+1;
   end;
   do until(last.level);
      set raw;
      by descending level;
      output;
   end;
run;[/code:3qvgp1xd]




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