全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
7535 24
2010-08-31
跟crackman读SAS程序(34)---迭代计算变量乘积
data a;
   input x1-x5;
datalines;
1 2 3 4 5
2 3 4 5 6
4 5 6 7 8
;
data b;
   set a;
   array test(5) x1-x5;
   do i=1 to dim(test)-1; /*注意这里面的减一*/
if i=1 then prod=test(i); /*注意如果第一个数字,那么就为起始*/
prod=prod*test(i+1); /*迭代*/
   end;
   drop i;
run;
proc print;
run;
注意学习的地方就是迭代

Obs x1 x2 x3 x4 x5 prod

1    1     2     3     4     5     120
2    2     3     4     5     6     720
3    4     5     6     7     8 6720
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2010-8-31 17:51:25
跟crackman读SAS程序(35)----根据FIRST.VAR和LAST.VAR来输出有无重复观测的数据集
data clasdata ;
input id name $ class $ ;
datalines;
4567 Denise ENGL201
4567 Denise ENGL201
1234 Lynn CHEM101
1234 Lynn CHEM101
1234 Lynn MATH102
5678 Rick CHEM101
5678 Rick HIST300
5678 Rick HIST300
3456 Amber CHEM101
3456 Amber Math102
3456 Amber Math102
2345 Ginny CHEM101
2345 Ginny ENGL201
2345 Ginny MATH102
;
proc sort ;
by name class ;
run;
data dups nodups ;
set clasdata ;
by name class ;                        
if first.class and last.class then output nodups ; /*FIRST.CLASS和LAST.CLASS同时为1的时候就输出*/
else output dups ;
run;
proc print data=dups;
title 'RESULTS of DUPS data set';
run;
proc print data=nodups;
title 'RESULTS of NODUPS data set';
run;
注意:我们知道,如果有重复观测对象出现,那么FIRST.CLASS应该是1 0 0 0 0 1(下一组的开始),那么LAST.CLASS则是0 0 0 0 1 0(下一组的开始)
如果没有重复观测对象的话,那么FIRST.CLASS为1 1(下一组开始) LAST.CLASS为1 0(下一组开始) 所以同时为1,确定了唯一性。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-8-31 17:51:59
跟crackman读SAS程序(36)--CMISS与NMISS函数的差别
data survey;

    input id diet exer hours xwk $ educ $;

    total_miss=nmiss(diet,exer,hours)+cmiss(xwk,educ);

datalines;

1 1 . 1 3 1

1 . 2 1 4 2

1 . 4 . . .

1 1 5 2 3 .

2 . 9 2 3 .

2 5 9 2 4 .

2 . 3 . 5 3

3 2 . . . .

;


如果不要后面的CMISS也可以得出需要的结果

但是CMISS与NMISS的却别是什么呢

看看下面的程序:

data survey;

    input id diet exer hours xwk $ educ $;

    total_miss=nmiss(diet,exer,hours,xwk,educ);

datalines;

1 1 . 1 A .

1 . 2 1 4 2

1 . 4 . . .

1 1 5 2 3 .

2 . 9 2 3 .

2 5 9 2 4 .

2 . 3 . 5 3

3 2 . . . .

;

结果是不一样的

在SAS 官方网站说明如下:

argument
specifies a constant, variable, or expression. Argument can be either a character value or a numeric value.

Details



A character expression is counted as missing if it evaluates to a string that contains all blanks or has a length of zero.

A numeric expression is counted as missing if it evaluates to a numeric missing value: ., ._, .A, ... , .Z.



Comparisons



The CMISS function does not convert any argument. The NMISS function converts all arguments to numeric values.

CMISS在计算缺失值的时候,不会对参数进行转换,而NMISS则会把所有的参数转换为数值然后来计算缺失值。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-8-31 17:52:29
跟crackman读SAS程序(37)----SQL LEFTJOIN
data a;
input   m id;
cards;
2 302783
2 303159
1 303163
4 303190
1 303209
1 303225
2 303306
1 302468
2 302866
1 302978
2 303189
2 303189
2 303495
1 302680
2 302704
2 302729
2 302918
1 303159
2 303172
2 303263
3 303407
2 302859
1 302868
2 302880
1 303014
1 303051
2 303109
2 303146
2 303219
2 303232
1 303235
1 302805
2 303036
2 303157
2 303179
2 303189
2 302293
1 302342
2 302509
2 302931
2 303230
1 302842
2 302895
1 302932
1 303005
2 303032
1 303036
1 303123
1 303251
1 303379
4 302197
1 302905
1 303095
4 302688
2 302911
2 302941
2 302983
1 302995
1 303021
2 303025
1 303222
;
data b;
input m id;
cards;
2 303481
1 303349
2 321002
2 303430
4 303553
1 303389
1 313001
1 313001
2 303406
1 328003
4 303263
1 302276
2 303678
2 302631
1 303034
2 316007
1 303658
2 302770
2 303665
2 303680
2 314000
2 302867
2 328005
2 302008
2 303699
2 321005
2 321019
1 303432
1 303523
2 303199
2 303519
;
proc sql;
create table c as
       select a.*,
            case b.h
                   when 1 then 1
                   else 0
            end as h
         from a left join (select distinct id, 1 as h from b) b
            on a.id=b.id;
quit;
这里学习的地方:
1.将一个查询结果直接作为再次查询的数据集,例如 (select distinct id, 1 as h from b) b
2.H作为指示变量
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-8-31 17:52:53
跟crackman读SAS程序(38)---ORDER BY 的作用
data raw;
input ID $ VAR;
cards;
001 80
001 20
001 30
001 12
001 43
001 62
002 40
002 25
002 60
002 32
002 62
002 34
002 68
003 10
003 75
003 20
003 19
003 72
003 12
003 20
003 15
;
proc univariate data=raw noprint;
var var;
class id;
output out=temp pctlpts=25 50 75 pctlpre=p;
run;
proc sql;
create table out as
   select   a.*,
         case
            when var le p25 then 1
            when p25 lt var le p50 then 2
            when p50 lt var le p75 then 3
            when p75 le var then 4
            else .
         end as TYPE
      from raw a,temp b
      where a.id=b.id
      order by a.id,var; /*这里面包括GROUP分组逐步来CASE WHEN*/
quit;
/*其实这里学习的应该是ORDER BY */
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-8-31 17:53:16
跟crackman读SAS程序(39)---NOTDIGIT函数 的作用
data raw;
   infile datalines truncover;
   input x $ y;
datalines;
a 1
2
3
b 1
2
3
;
data temp(drop=temp);
   retain temp;
   set raw;
   if notdigit(x)=1 then temp=x;
   else do;
         y=input(x,8.);
         x=temp;
      end;
run;其实这个程序有其他程序的风格还是一个中间变量TEMP以及NOTDIGIT函数的对是否为数值型变量的判断。data _null_;
   string='Next = _n_ + 12E3;';
   j=0;
   do until(j=0);    k=j+1;
      j=notdigit(string,k);
      if j=0 then put +3 "That's all";
      else do;
         c=substr(string,j,1);
         put +3 j= c=;
      end;    j+1;
   end;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群