楼主: dxystata
12322 7

如何给变量加label [推广有奖]

版主

大师

34%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
182304 个
通用积分
15205.2849
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
291081 点
帖子
5373
精华
1
在线时间
13477 小时
注册时间
2006-6-21
最后登录
2024-4-25

初级学术勋章 初级热心勋章 中级热心勋章 初级信用勋章

30论坛币
  1. data aaa;
  2. input label1$ var1 label2$ var2;
  3. cards;
  4. a 1 b 4
  5. a 2 b 5
  6. a 3 b 6
  7. ;
  8. run;

  9. %macro bbb;
  10. %let vars=var1 var2;
  11. data aaa1;
  12.         set aaa;
  13.         %let i=1;
  14.         %do %while(%scan(&vars.,&i.) NE %str());
  15.                 %let var=%scan(&vars,&i);   
  16.                 if _n_=1 then call symput('vlabel',label&i);
  17.                 %put &vlabel;
  18.                 label &var="vlabel";
  19.                 %let i=%eval(&i+1);
  20.     %end;
  21. run;

  22. %mend;

  23. %bbb;
复制代码
label1 label2 取值是唯一的,先根据label1的值给var1 加变量标签,label2的值给var2加变量标签,程序错在哪?如何修改?谢谢!

最佳答案

何必不淡定。 查看完整内容

hope this will help you
关键词:label Abel Lab symput cards 如何
  1. data aaa;
  2.     input label1$ var1 label2$ var2;
  3.     cards;
  4. a 1 b 4
  5. a 2 b 5
  6. a 3 b 6
  7. ;
  8. run;
  9. options mlogic mprint symbolgen;
  10. %macro bbb;
  11. %let vars=var1 var2;
  12. %let n=%eval(%sysfunc(countc("&vars",' '))+1);

  13.     data _null_;
  14.         set aaa;
  15.   %do j = 1 %to &n ;
  16.         call symput("vlabel&j",label&j);
  17.   %end;
  18.     run;

  19.     data aaa1;
  20.         set aaa;
  21.         %let i =1;
  22.         %do %while (%scan(&vars. , &i.) ne %str());
  23.             %let var=%scan(&vars,&i);
  24.             label &var= %nrbquote(&&vlabel&i);
  25.             %let i=%eval(&i +1);
  26.         %end;
  27.     run;
  28. %mend;
  29. %bbb
复制代码
hope this will help you

使用道具

藤椅
dxystata 发表于 2015-4-20 19:37:11 |只看作者 |坛友微信交流群
继续求助!

使用道具

板凳
dxystata 发表于 2015-4-21 08:01:15 |只看作者 |坛友微信交流群
继续求助!

使用道具

报纸
dxystata 发表于 2015-4-23 11:17:33 |只看作者 |坛友微信交流群
何必不淡定。 发表于 2015-4-21 10:44
hope this will help you
谢谢!
能否写在一个循环内?

使用道具

首先,我不太理解数据的格式。可能楼主是只是做一个测试。但是一个var只能对应一个label,可能是我驽钝,不太理解楼主给label多个取值的用意(是想循环label?)。
针对楼主的代码,有2个小问题:
1:call symput()生成的宏变量不能在该data步调用,除非用symget,但symget似乎很难在这个语境使用。symget是解析该抓取位置的变量值所对应的宏变量值
2: label &var="vlabel";可能是楼主笔误,漏了&  

愚见。

使用道具

7
dxystata 发表于 2015-4-26 19:24:01 |只看作者 |坛友微信交流群
何必不淡定。 发表于 2015-4-23 21:48
首先,我不太理解数据的格式。可能楼主是只是做一个测试。但是一个var只能对应一个label,可能是我驽钝,不 ...
Book1.xls (15.5 KB)
将excel中的第一列中的值作为第2列变量的label,结果出错!

ERROR: 值“)”是无效的 SAS 名。
WARNING: 没有解析宏 ) 的调用。


谢谢!

使用道具

dxystata 发表于 2015-4-26 19:24
将excel中的第一列中的值作为第2列变量的label,结果出错!

ERROR: 值“)”是无效的 SAS 名。
  1. data a ;
  2.     input subject var $ value ;
  3.     cards;
  4. x y  z
  5. 1 a 85.4
  6. 1 a 67.14
  7. 1 b 77.1
  8. 1 b 66.2
  9. ;
  10. run;
  11. data a ;
  12.     set a;
  13.     if _n_>1;
  14. run;
  15. /*我的理解:第一行为机器自动跑出来的奇葩label,需要删掉。
  16.             后面的obs依次为受试对象,检测项目,检测结果。
  17.             现在需要把第二列的名称作为label赋给结果。
  18. */

  19. /*data步的写法*/

  20. data a1 ;
  21.     merge a(where=( index(var1 ,"a")>0) rename=(var=var1 value=value1))
  22.           a(where=( index(var2, "b")>0) rename=(var=var2 value=value2));
  23.     by subject;
  24. run;
  25. data _null_ ;
  26.     set a1;
  27.     call symput ("label1",var1);
  28.     call symput ("label2",var2);
  29. run;
  30. data c ;
  31.     set a1 ;
  32.     label value1="&label1"
  33.           value2="&label2";
  34.     drop var: ;
  35. run;

  36. /*macro的写法*/
  37. %macro label ;
  38. proc sql ;
  39.     select countn(distinct var) into: nlabel from a;
  40.     select distinct var  into :label separated by "," from a ;
  41. quit;
  42. %do i = 1 %to &nlabel ;
  43.   %let label&i = %scan(%nrbquote(&label),&i,",");
  44.     data b&i (rename=(value=value&i));
  45.         set a ;
  46.         if var = "&&label&i"  ;
  47.         label value= &&label&i;
  48.     run;
  49. %end;
  50. data wanted (drop=var);
  51.     merge b:;
  52.     by subject;
  53. run;
  54. %mend label;
  55. %label
复制代码
hope this will help you

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 18:06