【问题标题】:sas macro in proc sqlproc sql中的sas宏
【发布时间】:2014-03-06 07:46:24
【问题描述】:

我有一个可能很简单但我想不通的问题。

我有列 name1 c1 c2 c3 c4 .... c8 我必须按名称对这些列求和并创建一个新数据。

这是我写的代码,但是没有用。

你能帮帮我吗?

PROC SQL;
   CREATE TABLE WORK.data1 AS 
   SELECT t1.name1, 

%let k=8
%macro test;
%do i=0 %to &k;
%sysfunc(SUM(C&i)) AS C&i;
%END;
%mend test;
%test;
      FROM WORK.data t1
      GROUP BY t1.name1,
QUIT;

【问题讨论】:

  • 也许可以看看这篇论文:www2.sas.com/proceedings/sugi29/243-29.pdf
  • 好的,我会研究这个。非常感谢
  • 没问题 :) 提示:在 %let 之后缺少分号,此时不需要使用 sysfunc。您可以将 mprint 与 mfile 结合使用,以获取包含由宏代码生成的基本代码的文件。对于调试和学习非常有用。
  • 我很新,感觉就像在海洋中:)。 mprint 和 mfile 现在在我的搜索列表中。谢谢。
  • 是的,SAS 一开始有点令人困惑,但对于某些任务来说,它确实是一个很棒的工具。

标签: sql macros sas proc


【解决方案1】:
data data;
input name1 $ c1 c2 c3;
datalines4;
a 1 2 3
a 1 2 3
b 1 2 3
b 1 2 3
;;;;
run;

%macro test(k=);
  PROC SQL;
   CREATE TABLE WORK.data1 AS 
   SELECT t1.name1 

%do i=1 %to &k.;
   , SUM(C&i.) AS C&i.
%END;

  FROM WORK.data t1
  GROUP BY t1.name1;
QUIT;

%mend test;
%test(k=3);

【讨论】:

  • 为什么要在“SUM(C&i.) AS C&i.”之前使用逗号。这些点的含义是什么?你能帮帮我吗?
  • 如果您将逗号放在“SUM(C&i.) AS C&i”之后。那么你会在最后一个生成的变量之后得到一个 comm(在我的示例中,在 c3 之后),这将导致语法错误。所以不要在宏循环之外放置任何逗号,以避免这种情况。在大多数情况下,宏变量名称后的点不是必需的。它告诉宏处理器宏变量的名称到此结束。我认为在大多数情况下,由于可读性和清晰性,即使您不必这样做,也很好。
  • 尝试在宏代码之前执行以下代码:Filename mprint "~/generated_code.sas"; Options mprint mfile; 这将为您提供文件 generated_code.sas 中没有宏代码的纯基本代码。
【解决方案2】:

这似乎是实现结果的一种复杂方式,PROC Summary 可以更轻松地使用冒号修饰符来对所有以 C 开头的变量求和。下面的代码运行 @Mike 创建的数据集并产生相同的输出。

proc summary data=data nway;
class name1;
var c: ;
output out=want (drop=_:) sum=;
run;

【讨论】:

  • 也非常聪明的解决方案。谢谢。它有效。但我必须处理以'c'开头的其他列。但没问题再次感谢你。
  • 然后只需将 var 语句更改为 c1-c3(或您的示例中的 c1-c8)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多