楼主: complicated
4144 17

[问答] 如何从数据集里读取宏参数 [推广有奖]

  • 3关注
  • 18粉丝

副教授

65%

还不是VIP/贵宾

-

威望
0
论坛币
6463 个
通用积分
3868.8149
学术水平
88 点
热心指数
86 点
信用等级
58 点
经验
21961 点
帖子
507
精华
0
在线时间
1425 小时
注册时间
2007-6-16
最后登录
2024-4-20

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
各位大侠,我又来提问了:写了一个宏,用来出城市月报的%macro report(city=)
...&city...
%mend

虽然执行起来我可以
%report(city='北京');
%report(city='上海');
%report(city='广州');
但是有221个城市之多……

于是建了一个citylist,希望把'城市'取出来带入宏参数然后循环执行,未果——
proc iml;
do i=1 to 221;
use citylist;
read all var{name} into x1 where(id=i);
end;
%report(city=x1);
quit;


简单提示一下就行,多谢!年后一直在看R,现在思路非常凌乱……
二维码

扫码加我 拉你入群

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

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

关键词:数据集 Report repor Macro Where SAS marco dataset parameters

密码被盗??
沙发
Imasasor 发表于 2013-2-20 15:47:28 |只看作者 |坛友微信交流群
data a;
input  city $;
cards;
上海
北京
;
run;

%macro report(city=);
data _null_;
put "&city.很脏";
run;
%mend;


data b;
set a;
call execute(%nrstr("%report%(city=")!!city!!%str(")"));
run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
complicated + 5 + 5 + 5 版主出马,一个顶俩!

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

欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

使用道具

藤椅
Imasasor 发表于 2013-2-20 15:50:51 |只看作者 |坛友微信交流群
方案二:
data a;
input  city $;
cards;
上海
北京
;
run;

proc sql;
select city into :city1-:city2 from a;
quit;
%macro xunhuan;
%do i=1 %to 2;
%report(city=&&city&i);
%end;
%mend;
%xunhuan
欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

使用道具

板凳
complicated 在职认证  发表于 2013-2-21 18:05:30 |只看作者 |坛友微信交流群
Imasasor 发表于 2013-2-20 15:47
data a;
input  city $;
cards;
经过两天的冥思苦想,我终于能够解读这段代码了,不对之处请指正!多谢指教了!

call execute用于在data step调用宏,
原则是,除了data步涉及的变量之外的内容都需要用引号,且是宏专用的引号。
这里实际上是
call execute要引用一段内容,这内容是 %report(city=city),其中第二个city是变量,其他都是需要加引号的
SAS连接变量和文本可以用!!和||,文本!!变量!!文本,于是可以这样写:
"%report(city="  !!  city  !!  ")"
而宏引用需要特定的写法,不能直接用“”,要用到%nrstr和%str,一个包括%和&,一个不包括,
再变身就成了 %nrstr("文本")!!变量!!%str("文本"),也就是
%nrstr("%report(city=")!!city!!%str(")")
最后,套上外皮
call execute(%nrstr("%report%(city=")!!city!!%str(")"));

真够闹心的啊……接下来再研究下一段代码
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Imasasor + 80 + 100 + 2 + 2 + 2 精彩帖子,真是认真钻研啊

总评分: 经验 + 80  论坛币 + 100  学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

密码被盗??

使用道具

报纸
complicated 在职认证  发表于 2013-2-21 22:16:06 |只看作者 |坛友微信交流群
Imasasor 发表于 2013-2-20 15:50
方案二:
data a;
input  city $;
嘿嘿 得到你这么妙的亲传我岂能不认真研读啊~
解读的清晰一点也为后来人提供便利嘛

第二段代码涉及到两方面内容
1是PROC SQL产生宏变量的问题——
2是宏嵌套的问题——

感觉还不能很好的理解,
更感觉SAS根深叶茂的实在超乎我的想象了。。。
密码被盗??

使用道具

地板
Imasasor 发表于 2013-2-21 22:18:34 |只看作者 |坛友微信交流群
complicated 发表于 2013-2-21 22:16
嘿嘿 得到你这么妙的亲传我岂能不认真研读啊~
解读的清晰一点也为后来人提供便利嘛
好好学习,看你头像也是个数据爱好者
欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

使用道具

7
complicated 在职认证  发表于 2013-2-21 22:38:56 |只看作者 |坛友微信交流群
Imasasor 发表于 2013-2-21 22:18
好好学习,看你头像也是个数据爱好者
嗯嗯 爱好,并且以此为业了~头像是用R画的wordcloud,文本挖掘的一个小尝试,呵呵
密码被盗??

使用道具

8
yongyitian 发表于 2013-2-22 05:25:11 |只看作者 |坛友微信交流群

这样好像可以, 简单一点

data a;   

input  location $;

cards;

ShangHai

BeiJing

TianJin

;run;

%macro report(city=);

data _null_;

put "MagCity.&city";

run;

%mend;

%report(city=ChongQing); /* test macro */

data b;

set a;

call execute('%report(city='  || location ||  ')');

call execute(%nrstr("%report%(city=")!!location!!%str(")"));

run;

使用道具

9
complicated 在职认证  发表于 2013-2-22 09:36:15 |只看作者 |坛友微信交流群
yongyitian 发表于 2013-2-22 05:25
这样好像可以, 简单一点data a;   input  location $;cards;ShangHaiBeiJingTianJin;run; %macro report(ci ...
非常感谢对我的问题的关注!
我试了一下,确实可以,所以说下面这两个语句的效果是一样的咯:
call execute('%report(city='  || location ||  ')');
call execute(%nrstr("%report%(city=")!!location!!%str(")"));
那确实简单了不少哇

但是这样又会报错
call execute(“%report(city=” || location ||  ')');

我理解单引号是固定文本引用,双引号会分辨特定字符的含义,对吗?
再次感叹SAS的世界观设定好复杂~
密码被盗??

使用道具

10
yongyitian 发表于 2013-2-22 09:58:34 |只看作者 |坛友微信交流群
complicated 发表于 2013-2-22 09:36
非常感谢对我的问题的关注!
我试了一下,确实可以,所以说下面这两个语句的效果是一样的咯:
call exe ...
是的,SAS9。2的官方文件里说了两种情况,我也搞不太懂。SAS9。13的help文件中有这个例子。刚刚学到,拿来分享。

使用道具

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

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

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

GMT+8, 2024-9-20 01:51