SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 2447|回复: 7
打印 上一主题 下一主题

求教:如何获得数据集中的变量名

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2003-10-24 15:58:11 | 只看该作者

求教:如何获得数据集中的变量名

以sashelp.class为例,我事先并不知道有几个变量,变量名是什么,我要得到第3个变量的变量名,如何实现?能用vname吗?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2003-10-24 17:06:15 | 只看该作者
是的,使用vname函数。下面的例子(来源于SAS的onlinedoc)或许对你有用:

data vars;
   length name $ 8 type $ 1
          format informat $ 10 label $ 40;
   drop dsid i num rc;
   dsid=open("sashelp.class","i");
   num=attrn(dsid,"nvars");
   do i=1 to num;
      name=varname(dsid,i);
      type=vartype(dsid,i);
      format=varfmt(dsid,i);
      informat=varinfmt(dsid,i);
      label=varlabel(dsid,i);
      length=varlen(dsid,i);
      position=varnum(dsid,name);
      output;
   end;
   rc=close(dsid);
run;
proc print data=vars;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2003-10-24 18:16:38 | 只看该作者

Re: 求教:如何获得数据集中的变量名

[quote="shiyiming":8ca52]以sashelp.class为例,我事先并不知道有几个变量,变量名是什么,我要得到第3个变量的变量名,如何实现?能用vname吗?[/quote:8ca52]

NO.

实际上student也并没有用vname,而是[color=blue:8ca52]varname()[/color:8ca52]

一个简单的例子:

%let [color=red:8ca52]SltDSN[/color:8ca52]=sashelp.class;
%let [color=red:8ca52]SltVarNum[/color:8ca52]=3; /*第3个变量*/
%let dsid=%sysfunc(open([color=red:8ca52]&SltDSN[/color:8ca52],i));
%let SltVarName=%sysfunc(varname(&dsid[color=red:8ca52],&SltVarNum[/color:8ca52])); /*根据变量位置确定变量名*/
%let rc=close(dsid);
%put [color=red:8ca52]&SltVarName[/color:8ca52];

如果需要编写一个宏的话,应该是非常简单的,两个参数SltVarNum, SltDSN; 返回SltVarName

多说几句:
[color=blue:8ca52]1/ VAR**系列函数为data set I/O functions是SASV7/8+以后增加的,但实际上SCL很早就有了,所以应该说data set I/O functions是从SCL借到SAS/BASE去的。看上面的写法是何等与SCL相似(rc=...).

2/ 当然student的写法也是data set I/O functions应用的另外一种方式,和BASE语句相似,可否说是这些fuctions从SCL搬进BASE后的入乡随俗的表现?

3/ V**系列函数则为Variable Information fuctions,是SASV7/8+以后增加的,有点效仿上述I/O函数,工作的对象为变量的属性(name, length等)。

4/ 用法上完全不同。[/color:8ca52]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2003-10-24 22:41:23 | 只看该作者
我是太粗心大意了,将vname和varname混为一谈了。

zibao的解答非常精彩,佩服!今后还请多多指教。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2003-10-30 10:23:53 | 只看该作者

新问题

如何将数据集所有的变量提取出来组成一个串呢;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2003-10-30 16:51:58 | 只看该作者
/* MACRO varlist: Gets the names of the numerical , dateformat  and character variables
                   from a dataset and writes them to macro variables.

   Input: Data_in = Name of input dataset

   Outputs: numlist = Macro variable of numerical variable names
           datelist = Macro variable of dateformat variable names
           charlist = Macro variable of character variable names

*/

%MACRO varlist(DATA_IN);

%global numlist datelist charlist;

* Get Contents;
proc contents data=&data_in out=temp1 noprint;
run;

*Create data set nums that contains only the names of the numerical but not date  vbles;
data nums(keep=name label);
set temp1(keep=name type label format);
if type=1 and format ne 'DATE';
run;

* Put each name in a macro vble, get number of vbles;
data _null_;
set nums;
call symput('NN'||left(put(_n_,10.)),left(put(name,$9.)));
call symput('numnums',_n_);
run;

* Concatenate the vble names;
%do i=1 %to &numnums;
  %if &i=1 %then %let numlist = &&NN&i;
  %else %let numlist = &numlist &&NN&i;
%end;
%put => The list of numerical vbles is: &numlist;

*Create data set nums that contains only the names of the  date  vbles;
data dats(keep=name label);
set temp1(keep=name type label format);
if type=1 and format eq 'DATE';
run;

* Put each name in a macro vble, get number of vbles;
data _null_;
set dats;
call symput('DD'||left(put(_n_,10.)),left(put(name,$9.)));
call symput('numdats',_n_);
run;

* Concatenate the vble names;


%do i=1 %to &numdats;
  %if &i=1 %then %let datelist = &&DD&i;
  %else %let &datelist = &datelist &&DD&i;
%end;
%put => The list of date format  vbles is: &datelist;







*Create data set chars that contains only the names of the char vbles;
data chars(keep=name label);
set temp1(keep=name type label);
if type=2;
run;

* Put each name in a macro vble, get number of vbles;
data _null_;
set chars;
call symput('DD'||left(put(_n_,10.)),left(put(name,$9.)));
call symput('numchars',_n_);
run;

* Concatenate the vble names;
%do i=1 %to &numchars;
  %if &i=1 %then %let charlist = &&DD&i;
  %else %let charlist = &charlist &&DD&i;
%end;
%put => The list of character vbles is: &charlist;



proc datasets library =WORK nolist;
delete nums  chars dats temp1;
run;


%MEND varlist;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2003-10-30 18:11:17 | 只看该作者
proc sql noprint;
select name into:str  separated by ',' from sashelp.vcolumn
where libname="SASHELP" and memname="CLASS";
quit;

%put &str;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2003-11-3 11:30:18 | 只看该作者
willon解答的好!

我一般中规中矩在proc sql中用dictionary.columns等,在data 步中用sashelp.vcolumn等。

不知两者有何大的区别?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 13:08 , Processed in 0.182063 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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