楼主: gaokaji16
2819 11

求助宏变量问题 [推广有奖]

  • 1关注
  • 0粉丝

大专生

41%

还不是VIP/贵宾

-

威望
0
论坛币
3 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
437 点
帖子
29
精华
0
在线时间
51 小时
注册时间
2010-4-24
最后登录
2020-6-11

楼主
gaokaji16 发表于 2013-1-8 17:27:20 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
数据集test1大致如下:
ID data1 data2 aaa bbb
1 321 332 1 0
2 123 123 2 0
3 444 212 1 0
...
现在想用一个data步让bbb的值变成data1或是data2,至于是变成data1还是data2由aaa的值来决定,即aaa为1时,bbb=data1;aaa为2时,bbb=data2;
我写成写成这样是肯定是不成功的:
data test1;
set test1;
%let temp=aaa;
bbb=data&temp;
run;
请问应该怎么做?(实际上的数据集要变量比这个多很多而且更复杂,所以感觉必须用宏来解决)
是要用到call symput?  SYMGET? 反正折腾了半天我是搞不明白了
本人系新手加外行,求教高手,多谢。希望有完整的程序,或者比较详细的解答,麻烦了。
二维码

扫码加我 拉你入群

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

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

关键词:symput data步 Data test Temp 而且

沙发
webgu 发表于 2013-1-8 18:43:26
一个三个变量的例子。
  1. data demo;
  2. input ID data1 data2  data3 aaa bbb;
  3. datalines;
  4. 1 11 12   23  1  0
  5. 2 21  22   23  2  0
  6. 3 31  32   33  3  0
  7. ;

  8. %macro iflist(n);
  9.     if aaa=1 then bbb=data1;
  10.    %do i=2 %to  &n;
  11.        else if  aaa=&i then bbb=data&i;
  12.         %end;
  13. %mend iflist;

  14. data want;
  15.         set demo;
  16.         %iflist(3);
  17. run;
复制代码
SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

藤椅
gaokaji16 发表于 2013-1-8 18:55:08
webgu 发表于 2013-1-8 18:43
一个三个变量的例子。
多谢,这个程序的确能解决我的问题,不过还是很想知道怎么在data步中把数据表中的值赋给宏变量,高手能否指点一二。

板凳
webgu 发表于 2013-1-8 19:02:52
data 中可以用call symputx('temp',aaa)把datase里的值组宏变量。但只能在下一个data步用。且这种方法只能保留得到最后一个纪录赋的值。

data _null_;
   set demo;
call symputx('temp',aaa);
run;

%put  &temp;
SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

报纸
gaokaji16 发表于 2013-1-8 19:20:43
webgu 发表于 2013-1-8 19:02
data 中可以用call symputx('temp',aaa)把datase里的值组宏变量。但只能在下一个data步用。且这种方法只能 ...
多谢,就是说data中没有我所设想的那种完美的利用宏变量去读取变量值的办法呗?

地板
ziyenano 发表于 2013-1-8 19:24:55
data _null_;
   set demo;
call symputx(cats('temp',_n_),aaa);
run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
webgu + 1 + 1 + 1 这个IDEA 不错。

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

7
pobel 在职认证  发表于 2013-1-8 21:23:57
一定要用宏变量么?

data demo;
input ID data1 data2  data3 aaa bbb;
bbb=ifn(aaa=1,data1,ifn(aaa=2,data2,data3));
datalines;
1 11 12   23  1  0
2 21  22   23  2  0
3 31  32   33  3  0
;

和谐拯救危机

8
gaokaji16 发表于 2013-1-8 21:36:17
pobel 发表于 2013-1-8 21:23
一定要用宏变量么?

data demo;
哇,多谢,又学一招,实际上有400多个变量,先用你之前教的那个方法吧,多谢了!!!

9
playmore 发表于 2013-1-9 09:56:58
webgu 发表于 2013-1-8 19:02
data 中可以用call symputx('temp',aaa)把datase里的值组宏变量。但只能在下一个data步用。且这种方法只能 ...
使用%SYMGET()函数即可以在同一个数据步中使用由call symput()函数创建的宏变量,如下所示:

data _null_;
   set demo;
call symputx('temp',aaa);
bbb=%symget('temp');
run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
webgu + 1 + 1 + 1 观点有启发

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

10
webgu 发表于 2013-1-9 10:42:14
playmore 发表于 2013-1-9 09:56
使用%SYMGET()函数即可以在同一个数据步中使用由call symput()函数创建的宏变量,如下所示:

data _nu ...
data _null_;
   set demo;
  call symputx('temp',aaa);
  bbb=symget('temp');
  put bbb;
run;
SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

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

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