我创建了以下宏.Proc power
返回pw_cout
包含列的表Power
.该data _null_
步骤将列Power
中的值分配pw_out
给宏变量tpw
.我希望宏返回值tpw
,以便在主程序中,我可以在DATA步骤中调用它,如:
data test;
set tmp;
pw_tmp=ttest_power(meanA=a, stdA=s1, nA=n1, meanB=a2, stdB=s2, nB=n2);
run;
Run Code Online (Sandbox Code Playgroud)
这是宏的代码:
%macro ttest_power(meanA=, stdA=, nA=, meanB=, stdB=, nB=);
proc power;
twosamplemeans test=diff_satt
groupmeans = &meanA | &meanB
groupstddevs = &stdA | &stdB
groupns = (&nA &nB)
power = .;
ods output Output=pw_out;
run;
data _null_;
set pw_out;
call symput('tpw'=&power);
run;
&tpw
%mend ttest_power;
Run Code Online (Sandbox Code Playgroud) 我有60个sas数据集,其中包含有关消费者个人特征的数据,例如 id, gender, age, amountSpent, ....
每个数据集仅显示一个时间段的数据(data1为Jan,data2为Feb ...).由于尺寸和其他一些问题,我无法合并它们.
如何编写多循环来遍历每个数据集,进行一些操作并将估计值保存到临时文件中.
SAS没有for
循环.我该怎么用do
?
%let test = one;
%let one = two;
%put &test;
%put &&test;
%put &&&test;
%put &&&&test;
%put &&&&&test;
Run Code Online (Sandbox Code Playgroud)
好.我完全被这些&符号击败了.我不明白他们为什么在宏变量之前需要那么多的&符号.有没有什么技巧可以掌握&符号的用法?顺便说一下,五个结果相应的是什么?
我有一个宏变量,&myvar
但是当我尝试将它放入数据步变量时它不会解析.为什么不呢,我该怎么做才能解决这个问题呢?
%let myvar=Hello, world;
data _null_;
x='&myvar.';
put x=;
run;
Run Code Online (Sandbox Code Playgroud) 我试图修改下面的宏来接受一个宏参数作为dir命令的'location'参数.但是由于嵌套引号问题,我无法正确解析它.使用%str(%')不起作用,也不会出于某种原因引用函数.
当文件路径没有空格(例如C:\ temp\withnospace)时,宏将正常工作,因为不需要中间引号.但是我需要这个宏来处理带空格的文件路径(例如'C:\ temp\with space \').
请帮忙!
%macro get_filenames(location)
filename pipedir pipe "dir &location. /b " lrecl=32767;
data filenames;
infile pipedir truncover;
input line $char1000.;
run;
%mend;
%get_filenames(C:\temp\) /* works */
%get_filenames('C:\temp\with space') /* doesnt work */
Run Code Online (Sandbox Code Playgroud) 我正在搜索SAS 9.3宏语言中的for循环(如Python或R中)的等效内容.该DO循环似乎的是解决办法,但正是我以前不工作,因为我想要的.我在一个带有DO循环的数据步骤中创建了一种方法,但它不适用于宏语言.例如,在数据步骤中,此代码正在运行:
DATA _NULL_;
DO i = 1,3,5,9;
PUT i;
END;
RUN;
Run Code Online (Sandbox Code Playgroud)
然后按预期的日志提示:
1
3
5
9
Run Code Online (Sandbox Code Playgroud)
当我尝试在宏中使用%DO循环时,我有一个错误.
%MACRO test();
%DO i = 1,2,4,9 ;
%PUT i = &i;
%END;
%MEND;
%test();
Run Code Online (Sandbox Code Playgroud)
日志提示这些消息:
ERROR: Expected %TO not found in %DO statement.
ERROR: A dummy macro will be compiled
Run Code Online (Sandbox Code Playgroud)
我是SAS和stackoverflow的新手,所以我希望我的问题不是太愚蠢.在Python和R中执行此操作非常简单,因此必须有一种简单的方法在SAS中执行此操作.
谢谢你的帮助 - J.穆勒
我在宏中定义一个宏变量.然后,我将它喂入第二个宏.在macro2计数器内部将值更改为200.但是,当我检查宏2变量运行后我放入的宏变量内部时,它仍然显示0.我希望它存储值200?这可能吗?
%macro macro1();
%let variable1= 0;
macro2(counter=&variable1)
%put &variable1;
%mend macro1;
%macro1;
Run Code Online (Sandbox Code Playgroud) 在我的代码中,我有几个宏.宏A是主宏.宏A然后调用宏B,宏B又调用宏C.
在SAS中,我是否必须按向后顺序定义它们?换句话说,我必须首先定义宏C,然后定义宏B,然后定义宏A吗?或者它是否重要,因为SAS在实际命中运行宏之前读取所有代码?就此而言,我可以发出命令来运行宏作为我的代码中的第一个语句,然后在命令下面定义宏吗?
谢谢!
一般来说,我们如何处理需要在宏内部修改宏变量的情况; 例如,假设我有这个宏:
%macro test (arg=);
array arrayone [&arg]; /* This is ok */
array arraytwo [&arg+1] /* This is not ok. How to make it work? */
...
Run Code Online (Sandbox Code Playgroud)
当我想要%test(3)然后arraytwo需要采用维度4时,我们如何管理这些情况?