全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3766 9
2012-02-22
有两个问题:
第一个是在%let n=length(xx);中 length函数不能使用吗?我试了下总是报错。
第二个问题是如何给宏传递形参呢?
比如:
data test;
set test1;
n=length(name);
%chage(&n);
run;
我想把n的值也就是name的长度传给chage这个宏,但是总是报错,我该如何写呢?
二维码

扫码加我 拉你入群

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

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

全部回复
2012-2-22 17:27:57
call symput("n",length(name));
二维码

扫码加我 拉你入群

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

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

2012-2-22 17:39:28
数据集变量和宏变量是两个概念,在同一个data step中不可使用数据集的变量给宏变量赋值,因为在run;语句提交前,宏变量还不存在。
你提的第一个问题可以这样写, 但是abc只能代表一个字符串或者是一个宏变量,不是数据集变量。
%let len=%sysfunc(length(abc));
%put &len;
第二个问题,可以这样写
data test;
set test1;
n=length(name);
call symput('n',n);
run;
%chage(&n);
二维码

扫码加我 拉你入群

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

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

2012-2-23 12:53:25
Jackywolf_2008 发表于 2012-2-22 17:39
数据集变量和宏变量是两个概念,在同一个data step中不可使用数据集的变量给宏变量赋值,因为在run;语句提交 ...
太感谢您了,您从根本上解决了我心中的疑惑,如果有多个变量需要调用的话,比如宏中有两个变量。那么就需要在data步骤里面用两次 call symput()函数来调用这两个参数对吧?还有就是我用call symput()函数,运行的结果是只把最后一个观测的变量的values传出去了,而不是每一个都传出去了。怎么回事儿呢?请看下面这个例子:proc sql;
create table customer(
id int,
name char(50)
)
;
data test1;
input id name $;
datalines;
1 wang
2 lei
3 wency
4 lucy
5 jacky
;
run;

data test;
set test1;
call symput('id',id);
call symput('name',name);
run;
%chage(&id,&name);
%macro chage(id,name);
proc sql;
insert into customer (id,name) values (&id,&name);
%mend;

我想把test1的值保存在test里面的同事还保存到表customer中,就用了这个宏。有两个问题,第一 values后面跟的参数总是报错,说格式不对。第二,就算运行成功 customer表里面也只有一个值,就是test1的最后一个观测。5 jacky。 我该怎么办才能把所有记录都保存呢,难道symput只能读取最后一个观测?
二维码

扫码加我 拉你入群

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

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

2012-2-23 13:53:58
value报错,是因为name在customer表中是字符型的,你需要用双引号引起来。
第二个问题的方法有很多,我这只是其中一种,未必是最优,仅供参考。
proc sql noprint;
create table customer(
id int,
name char(50)
)
;
quit;

data test1;
input id name $;
datalines;
1 wang
2 lei
3 wency
4 lucy
5 jacky
;
run;

data test;
set test1 nobs=total end=last;
call symput(cats('id',_N_),id);
call symput(cats('name',_N_),name);
if last then call symput('total',total);
run;
%put &total;


%macro chage(id,name,obsnum);
proc sql;
%do i=1 %to &obsnum;
insert into customer (id,name) values (&&id&i,"&&name&i");
%end;
quit;
%mend;
%chage(id,name,&total);
二维码

扫码加我 拉你入群

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

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

2012-2-23 14:10:17
Jackywolf_2008 发表于 2012-2-23 13:53
value报错,是因为name在customer表中是字符型的,你需要用双引号引起来。
第二个问题的方法有很多,我这只 ...
我不知道该如何谢谢你,我刚注册分数太少了。1023141064我qq有什么事情安排小弟,小弟万死不辞。
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群