SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

12
返回列表 发新帖
楼主: shiyiming
打印 上一主题 下一主题

问题请假,谢谢!

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
11#
 楼主| 发表于 2008-2-22 19:59:32 | 只看该作者

Re: 问题请假,谢谢!

[quote="mymine":2x0joz73]然后如果变量N多,且变量名没有规律的
有没有不用一个一个变量名输入的方法![/quote:2x0joz73]
你仔细体会一下我的程序,答案就在里面!!!
可以的。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
12#
 楼主| 发表于 2008-2-22 20:47:23 | 只看该作者

Re: 问题请假,谢谢!

[code:3e2mueao]
/*假设你的第一个项目为a,最后一个项目为m,一共有50个项目*/

proc means data=a nway noprint;
   var a--m;
   class name;
   output out=aa(drop=_type_ _freq_) range=r1-r50;
run;
data result(drop=r1-r50 i) ;
   set aa;
   array r{50} r1-r50;
   array v{50} $;
   do i=1 to dim(r);
   if r(i) then v(i)='N';
   else v(i)='Y';
   end;
run;

[/code:3e2mueao]

最后变量v1-v50分别记录了50个项目的情况,不知道能否满足你的要求
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
13#
 楼主| 发表于 2008-2-22 21:02:56 | 只看该作者

to waterlwh

这个程序不错,不用逐个输入各个变量名
不过里面部分程序还看不懂呵呵
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
14#
 楼主| 发表于 2008-2-22 21:05:44 | 只看该作者

to byes

谢谢哦,我在体会一下哈
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
15#
 楼主| 发表于 2008-2-22 21:20:00 | 只看该作者

Re: 问题请假,谢谢!

如果你想把v1-v50还是用原来项目的变量名,请参考以下程序(还是以50个变量为例子):
[code:334jje0v]
data _null_;
        length val $800;
        dsid=open('a');
        array tt{50} $20;
        do i=1 to 50;
        tt(i)=varname(dsid,i+1);
        end;
        val=catx('',of tt1-tt4);
        call symput('val',trim(left(val)));
        rs=close(dsid);
run;
proc means data=a nway noprint;
   var &val;
   class name;
   output out=aa(drop=_type_ _freq_) range=r1-r50;
run;
data result(drop=r1-r50 i) ;
   set aa;
   array r{*} r1-r50;
   array v{*} $ &val;
   do i=1 to dim(r);
   if r(i) then v(i)='N';
   else v(i)='Y';
   end;
run;

[/code:334jje0v]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
16#
 楼主| 发表于 2008-2-22 21:26:01 | 只看该作者

Re: 程序有个bug,修改一下

[code:3695cfor]data aa;
input name $ a  b c d ;
cards;
XX 1 2 3 4
XX 1 2 3 4
XX 2 2 3 4
YY 1 1 1 1
YY 1 1 1 2
ZZZ 3 3 3 3
ZZZ 3 3 3 3
ZZZ 3 3 3 3
ZZZ 3 3 3 3
;
proc sort;by name;run;

proc sql noprint;
select count(name) into :n from sashelp.vcolumn
where libname='WORK' and memname='AA' and type='num';
select name into :name separated by ' ' from sashelp.vcolumn
where libname='WORK' and memname='AA' and type='num';
quit;

data bb(drop=&name i x);
set aa;by name;
array aa _numeric_;
array bb(&n);
do i=1 to  dim(aa);
x=lag(aa(i));
if aa(i)-x=0 then aa(i)=.;
if first.name then aa(i)=.;
bb(i)=aa(i);
end;
run;
run;

data cc(keep=name &name);
set bb;by name;
array aa _numeric_;
array bb(&n) $ &name;
retain &name;
do i=1 to &n;
if aa(i) ne . then bb(i)='N';
if first.name then bb(i)=' ';
end;
if last.name;
run;
[/code:3695cfor]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
17#
 楼主| 发表于 2008-2-22 21:42:05 | 只看该作者

Re: 问题请假,谢谢!

在byes的程序基础上用点macro,means在这儿确实可以减少步骤
[code:2d9g9f37]data aa;
input name $ a  b c d ;
cards;
XX 1 2 3 4
XX 1 2 3 4
XX 2 2 3 4
YY 1 1 1 1
YY 1 1 1 2
ZZZ 3 3 3 3
ZZZ 3 3 3 3
ZZZ 3 3 3 3
ZZZ 3 3 3 3
;
run;
proc sql noprint;
select put(count(name),5.-L)  into :n from sashelp.vcolumn
where libname='WORK' and memname='AA' and type='num';
select name into :name separated by ' ' from sashelp.vcolumn
where libname='WORK' and memname='AA' and type='num';
quit;

proc means data=aa nway noprint;
   var &name;
   class name;
   output out=bb(drop=_type_ _freq_) range=r1-r&n.;
run;


data result(drop=r1-r&n. i) ;
   set bb;
   array r{&n} r1-r&n.;
   array v{&n} $ &name;
   do i=1 to dim(r);
   if r(i) then v(i)='N';
   end;
run;
[/code:2d9g9f37]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
18#
 楼主| 发表于 2008-2-25 17:17:23 | 只看该作者

Re: 问题请假,谢谢!

[code:3b8kq62v]data ahuige;
  input name$  a$ b$ c$ d$;
  cards;
XX 1 2 3 4 ……
XX 1 2 3 4 ……
XX 2 2 3 4 ……
YY 1 1 1 1 ……
YY 1 1 1 2 ……
ZZZ 3 3 3 3 ……
ZZZ 3 3 3 3 ……
ZZZ 3 3 3 3 ……
ZZZ 3 3 3 3 ……
;
run;

proc sql;
  select compbl(', case when max('||name||')<>min('||name||') then "N" else "" end as '|| name) into :statement separated by ''
  from sashelp.vcolumn
  where memname='AHUIGE' and libname='WORK' and name<>'name'
  ;

proc sql;
  create table final as
  select name &statement
  from ahuige
  group by name
  ;[/code:3b8kq62v]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
19#
 楼主| 发表于 2008-2-25 18:05:33 | 只看该作者

Re: 问题请假,谢谢!

这个帖子可真够热的,已经演化成了高手飚程序了,连ahuige都出手了,呵呵呵。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
20#
 楼主| 发表于 2008-2-26 13:04:39 | 只看该作者

Re: 问题请假,谢谢!

谢谢大家的支持哈
我用了其中一两种程序实现了我的目的
后面的程序有些难度挺大的,还没有看明白
再学习学习,谢谢哦!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-4 17:38 , Processed in 0.069155 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表