楼主: caibirdcnb
14742 11

[原创博文] 请问如何获取数据集里面的所有列名?谢谢! [推广有奖]

  • 0关注
  • 37粉丝

讲师

47%

还不是VIP/贵宾

-

威望
0
论坛币
1367 个
通用积分
16.5538
学术水平
67 点
热心指数
70 点
信用等级
64 点
经验
6762 点
帖子
206
精华
2
在线时间
433 小时
注册时间
2011-8-31
最后登录
2023-9-23

楼主
caibirdcnb 发表于 2011-9-20 14:06:04 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
请问各位高手,请问如何获取数据集里面的所有列名?谢谢!

1. 我有1个宏会产生1个数据集test如下,这个数据集的列名,列数,列性质,行数不是固定的,例如第一个列名当前是"UP_DOWN",但宏下次运行,该列名可能变为“ABC”。


2. 我想根据上面数据集的行数n得到n个宏变量,以便其它程序调用。这n个宏变量是所有上面变量的组合,例如,对上面的表,应该产生如下2个宏变量L1, L2:
L1 =        “UP_DOWN=D ss=63409 mean=0.125xxxx std=0.014xxx”
L2 =        “UP_DOWN=U ss=45499 mean=0.1235xxxx std=0.013xxx”

我想用类似下面的程序实现,但不知道怎么调用列名和列内容,因为列名是不固定的。
  1. data _null_;
  2. set test;
  3.     do i = 1 to n;
  4.     call symputx('L'||left(_n_),catt(' 列1名称=',    列1内容,    ' 列1名称=',    列2内容,    ' 列3名称=',    列3内容 。。。));
  5.    end;
  6. run;
复制代码

谢谢了!
二维码

扫码加我 拉你入群

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

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

关键词:数据集 symput Down mean test 如何 程序

本帖被以下文库推荐

沙发
soporaeternus 发表于 2011-9-20 14:33:59
  1. data _null_;
  2.         set sashelp.class;
  3.         length str $1000;
  4.         array _n _numeric_;
  5.         array _c _character_;
  6.         do over _n;
  7.                 str=catx(" ",str,catx("=",vname(_n),_n));
  8.         end;
  9.         do over _c;
  10.                 if compress(upcase(vname(_c)))^="STR" then
  11.                 str=catx(" ",str,catx("=",vname(_c),_c));
  12.         end;
  13.         put str;
  14.         call symputx(compress("L"||_N_),str);
  15. run;
  16. %put &L1 &L10;
复制代码
不太在意变量顺序的话,这个或许行,希望对你有帮助
Let them be hard, but never unjust

藤椅
caibirdcnb 发表于 2011-9-20 15:23:57
soporaeternus,非常感谢!
我将_n和_c颠倒后,得到我希望的结果,谢谢!

我注意到我最上面那个数据集的小数位格式太多了,所以打算如果绝对值小于1就保留3位小数点,否则保留1位,我按照你程序的思想去format,但是下面两个程序都不成功,请问应该怎么做呢?谢谢!
  1. data _xxx;
  2.         set _xxx;
  3.         array _n _numeric_;
  4.         do over _n;
  5.                         if abs(_n)<1 then format vname(_n) 10.3;
  6.                         else format vname(_n) 10.1;
  7.                 end;
  8. run;
复制代码
  1. data _xxx;
  2.         set _xxx;
  3.         array _n _numeric_;
  4.         do over _n;
  5.                         if abs(_n)<1 then format _n 10.3;
  6.                         else format _n 10.1;
  7.                 end;
  8. run;
复制代码

板凳
dyes0506 发表于 2011-9-20 15:49:01
/*输入参数为逻辑库名(lib)和数据集名(dataset)*/
%macro youfmt(lib,dataset);
proc sql;
        /*求数据集的变量数存入宏变量n*/
        select count(*) into :n
        from dictionary.columns
        where upcase(libname)=%upcase("&lib") and upcase(memname)=%upcase("&dataset");

        /*将n个变量名分别存入宏变量col1到coln中*/
        select name into :col1-:col%cmpres(&n)
        from dictionary.columns
        where upcase(libname)=%upcase("&lib") and upcase(memname)=%upcase("&dataset");
quit;       

/*按照所需格式将每个观测值存入宏变量L1-Lm*/
data _null_;
        format temps $10000.;
        set perm.all;
        %do i=1 %to &n;
                temps=catx(' ',temps,"&&col&i",'=',&&col&i);
        %end;
        call symput('L'||left(_n_),temps);
run;
%put 第一个记录的输出值:&L1;
%mend youfmt;

%youfmt(work,test);
从数据到结论过程关键的是人不是软件......

报纸
soporaeternus 发表于 2011-9-20 15:49:50
  1.                 if _n>=100 then str=catx(" ",str,catx("=",vname(_n),put(_n,10.6)));
  2.                 else str=catx(" ",str,catx("=",vname(_n),put(_n,10.)));
复制代码
稍作改动......希望对你有帮助
Let them be hard, but never unjust

地板
yugao1986 发表于 2011-9-20 20:21:52
dyes0506 发表于 2011-9-20 15:49
/*输入参数为逻辑库名(lib)和数据集名(dataset)*/
%macro youfmt(lib,dataset);
proc sql;
请教下:set perm.all是什么??
三人行必有我师

7
dyes0506 发表于 2011-9-21 08:29:45
选择要分析的数据集
应该写成:set &lib..&dataset;
从数据到结论过程关键的是人不是软件......

8
caibirdcnb 发表于 2011-9-21 10:47:26
非常感谢soporaeternus和dyes0506的指导。

soporaeternus,我还有1个问题请教,如下面代码所示,我将你的程序写成1个宏,这个宏运行没问题,但当我随便写个AAA数据步想验证我是不是能引用&Ln的时候,发现出错了,具体错误信息如下:
263  X = "&L5";
WARNING: Apparent symbolic reference L5 not resolved.


还是下面这个程序,好像不用宏就不会出错。
谢谢了!
  1. %macro getString (_in =);
  2. data _null_;
  3. set &_in;
  4. length str $1000;
  5. array _n _numeric_;
  6. array _c _character_;
  7.     do over _c;
  8.      if compress(upcase(vname(_c)))^="STR" then
  9.        str=catx(" ",str,catx("=",vname(_c),_c));
  10.     end;
  11. do over _n;
  12.   if abs(_n) < 1 then
  13.    str = catx(" ", str, catx("=", vname(_n), put(_n, 10.3)));
  14.   else if abs(_n) < 1000 then
  15.    str = catx(" ", str, catx("=", vname(_n), put(_n, 10.1)));
  16.   else
  17.    str = catx(" ", str, catx("=", vname(_n), put(_n, 10.0)));
  18. end;
  19. call symputx(compress("L"||_N_),str);
  20. put _all_;
  21. run;
  22. %mend getString;

  23. %getString (_in = xxxxxxxx);

  24. data AAA;
  25. X = "&L5";
  26. run;
复制代码

9
soporaeternus 发表于 2011-9-21 11:06:01
  1. data _null_;
  2.         set &_in nobs=nobs;
  3.         call symputx("N",nobs);
  4.         stop;
  5. run;
  6. %do i=1 %to &N;
  7.         %global L&i;
  8. %end;
复制代码
global一下相应的宏,注意和其他程序调用的global宏是否冲突
Let them be hard, but never unjust

10
caibirdcnb 发表于 2011-9-21 21:04:14
soporaeternus,正常工作了,真的非常感谢!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-8 16:46