我最近继承了一个看起来像这样的SAS程序:
%MACRO ComplicatedStuff( GroupId= );
%LET FileId = %SYSFUNC( OPEN( Work.BigDataSet ) );
%PUT 'Doing something really difficult with ' &GroupId.;
%LET CloseRC = %SYSFUNC( CLOSE( &FileId. ) );
%MEND ComplicatedStuff;
%ComplicatedStuff(GroupId=ABC1);
%ComplicatedStuff(GroupId=DEF2);
%ComplicatedStuff(GroupId=3GHI);
%ComplicatedStuff(GroupId=J4KI);
Run Code Online (Sandbox Code Playgroud)
作为一个多方面的程序员,我看着这个并且想"我肯定能让这个变得更有活力".果然,我能够使用以下方法开发我认为简单的解决方案CALL EXECUTE:
DATA Work.IDs;
INPUT ID $4.
;
DATALINES;
ABC1
DEF2
3GHI
J4KI
RUN;
DATA Work.CommandDebug;
SET Work.IDs;
Command = CATS(
'%ComplicatedStuff(GroupId=', ID, ');'
);
CALL EXECUTE( Command );
RUN;
Run Code Online (Sandbox Code Playgroud)
我很满意这个解决方案,直到将ComplicatedStuff生成的文件FTP到另一台服务器.我们的SAS服务器在Unix上运行,SAS管理员为我们创建了一个有用的小宏来调用named %sas_sftp(因为,我被告知,x代码变得非常难看).不幸的是,我无法发布%sas_sftp代码 - 它属于我的公司,我不认为他们想要它.
我尝试像调用%sas_sftp宏一样调用%ComplicatedStuff …
我有一个60gb的sas7bdat文件我试图在R中进行子集.有没有人知道这样做的方法?
我有SAS,它需要大约14分钟才能完成,但是我想在R中做到这一点.
谢谢
我在SAS中多次运行宏,如下所示:
%mymac(a,b);
%mymac(a,c);
.
%mymac(a,a)
%mymac(a,w);
.
Run Code Online (Sandbox Code Playgroud)
我的程序/宏类似于:
/* begin program here */
data original_data;
set mylib.mydata;
run;
%macro mymac(x,y);
data mydata1;
set original_data;
where school_district="&x";
run;
proc means data=mydata1;
var income;
run;
%mend mymac;
Run Code Online (Sandbox Code Playgroud)
我意识到我忘记了一个分号(如(a,a)中所示)并且SAS似乎并不介意.它运行所有的宏调用没有问题.当我添加分号时,我比较了输出,我看不出有什么区别.
这是正常的,SAS没有丢失分号的错误吗?
在SAS中,如果我有一个字符串或数组,如下所示,
array x[4] $1 ('A' 'B' 'C' 'D');
Run Code Online (Sandbox Code Playgroud)
我需要生成元素的所有"唯一"排列,如下所示,
[ABCD]
[ABC]
[BCD]
[ACD]
[ABD]
[AB]
[AC]
[AD]
[BC]
[BD]
[CD]
[A]
[B]
[C]
[D]
Run Code Online (Sandbox Code Playgroud)
SAS中是否有一个函数用于生成阵列的所有可能组合?
我想从已存在的其他宏变量创建一个新的宏变量。
我尝试了多种变体call symput,%eval但input都无济于事......
我想d评估为 3 / 30 = .10。
***** taken directly from the sas help files... ;
%let a=1+2;
%let b=10*3;
%let c=5/3;
%let eval_a=%eval(&a);
%let eval_b=%eval(&b);
%let eval_c=%eval(&c);
%put &a is &eval_a;
%put &b is &eval_b;
%put &c is &eval_c; * not sure why this evaluates to 1, but I'm sure it's documented somewhere... ;
***** This evaluates to 0...
%let d = %eval(%eval(&a) / %eval(&b)) ;
%put &d ; …Run Code Online (Sandbox Code Playgroud) 在 SAS 9.3 中,我可以ODS HTML GPATH用来指定我想要保存图形的路径(如果我愿意的话)。在 9.4 中,默认情况下(即每次我打开 SAS 时),每当我制作图形(PROC SGPLOT例如,带有)时,它都会自动将绘图保存到保存 SAS 程序的位置。我试过转到工具 --> 选项 --> 首选项 --> 结果并取消选中 HTML 和 ODS 选项的每个组合,但无论如何我仍然会自动保存图形。我怎样才能关闭它?最好我还是有ODS输出内SAS,但我不希望这些PNG(或其他)图像SAS之外自动保存到我的电脑。
编辑:更多信息,因为上述差异尚不清楚。
1)在 9.3 中,我不得不说ODS GRAPHICS ON并指定ODS HTML GPATH,以便让 SAS 将我的绘图保存到 SAS 之外的我的计算机上(或者我是这么认为的)。如果我想要 SAS 内部的 ODS 图形,但不想在 SAS 之外保存图形,我可以说ODS GRAPHICS ON并跳过该ODS HTML GPATH语句。
2)当我打开 9.4 并且不做任何声明ODS(即保留默认设置),而是运行一个过程,如SGPLOT, I A)得到一个 html 图(显示在 SAS 的“结果”窗口中的 ODS 图)和我可以双击在 Windows 照片查看器中打开的图形,并且 …
我正在尝试将datetime22.3变量转换为ddmmmyy10.在proc sql中,这在输出列中给了我******.
如何在输出列中获取正确的值?
我知道在teradata或其他sql平台上你可以通过以下方式找到变量组合的计数:
从db.table中选择count(distinct x1 || x2)
这将给出x1,x2对的所有独特组合.
但是,此语法在proc sql中不起作用.
无论如何在proc sql中执行这样的计数?
谢谢.
我一直在寻找解决方案,但我在SAS社区找不到任何类似的问题.所以这是我的问题:我有一个很大的SAS表:让我们说2个类和26个变量:
A B Var1 Var2 ... Var25 Var26
-----------------------------
1 1 10 20 ... 35 30
1 2 12 24 ... 32 45
1 3 20 23 ... 24 68
2 1 13 29 ... 22 57
2 2 32 43 ... 33 65
2 3 11 76 ... 32 45
...................
...................
Run Code Online (Sandbox Code Playgroud)
我需要通过Class = B来计算所有26个变量的累积和,这意味着对于A = 1,它将累积到B = 1,2,3; 对于A = 2,它将通过B = 1,2,3累积.结果表将如下:
A B Cum1 Cum2 ... Cum25 Cum26
-----------------------------
1 1 10 20 ... 35 30 …Run Code Online (Sandbox Code Playgroud) 我在SAS网站上找到了以下代码,但在输入语句后无法理解":"的功能是什么.
data recessions;
input startdate :date7. enddate :date7.;
format startdate enddate date7.;
datalines;
01Mar01 01Nov01
01Dec07 01Jun09
;
run;
Run Code Online (Sandbox Code Playgroud)