Sas 使用_n_命名变量,这是数据步骤每次迭代的一列

Sas 使用_n_命名变量,这是数据步骤每次迭代的一列,sas,Sas,我需要为数据步骤的每次迭代声明一个变量(对于每个n),但是当我运行代码时,SAS将只输出声明的最后一个变量,即最大的n 为每一行声明一个变量似乎很愚蠢,但我需要实现这个结果,我正在处理由proc freq创建的数据集,并且我需要为每个组(数据集的每一行)创建一个列 结果将是一个宏,因此它必须是完全灵活的 proc freq data=&data noprint ; table &group / out=frgroup; run; data group1; set group (

我需要为数据步骤的每次迭代声明一个变量(对于每个n),但是当我运行代码时,SAS将只输出声明的最后一个变量,即最大的n

为每一行声明一个变量似乎很愚蠢,但我需要实现这个结果,我正在处理由proc freq创建的数据集,并且我需要为每个组(数据集的每一行)创建一个列

结果将是一个宏,因此它必须是完全灵活的

proc freq data=&data noprint ;
table &group / out=frgroup;
run;

data group1;
set group (keep=&group count ) end=eof;
call symput('gr', _n_);
*REQUESTED code will go here;
run;
我试过这些:

var&gr.=.;
call missing(var&gr.);
还有很多其他的说法,但都不起作用。 始终相同的结果,ds仅包括var&gr,其中&gr为最大n

PDV似乎在每次迭代中都覆盖新变量,但名称不同。 请将结果包含在单个数据步骤中,或者,至少让代码尽可能少地花费时间

你知道我怎样才能达到要求的结果吗


谢谢。

宏变量不像您想象的那样工作。任何宏变量引用都是在编译时解析的,因此在解析所有引用之后,
调用symput
会更改宏变量的值。在&gr为最大值n的情况下获得结果的原因是,这是上次运行代码时&gr的结果

如果您知道可以确定最大值
\u n
,则可以将最大值放入宏变量并声明如下数组:

查找最大值
\u n\u
并将值分配给
maxn

data _null_;
  set have end=eof;
  if eof then call symput('maxn',_n_);
run;
创建变量:

data want;
  set have;
  array var (&maxn);
run;

宏变量不像你想象的那样工作。任何宏变量引用都是在编译时解析的,因此在解析所有引用之后,
调用symput
会更改宏变量的值。在&gr为最大值n的情况下获得结果的原因是,这是上次运行代码时&gr的结果

如果您知道可以确定最大值
\u n
,则可以将最大值放入宏变量并声明如下数组:

查找最大值
\u n\u
并将值分配给
maxn

data _null_;
  set have end=eof;
  if eof then call symput('maxn',_n_);
run;
创建变量:

data want;
  set have;
  array var (&maxn);
run;

如果您不喜欢
proc transpose
(如果您需要3列,您可以对每列使用一次,然后将输出放在一起),可以使用数组来完成您的请求

首先需要确定输入数据集中的组数(即行数),然后定义一个维数等于该数的数组

然后可以使用
作为索引调用数组的第i个元素。
在以下代码
&gr.
中包含组数:

data group1;
    set group;
    array arr_counts(&gr.) var1-var&gr.;
    arr_counts(_n_)= count;
run;
在SAS中,有几种方法可以确定数据集中OB的数量,我最喜欢的方法是:(不适用于视图)


如果您不喜欢
proc transpose
(如果您需要3列,您可以对每列使用一次,然后将输出放在一起),可以使用数组来完成您的请求

首先需要确定输入数据集中的组数(即行数),然后定义一个维数等于该数的数组

然后可以使用
作为索引调用数组的第i个元素。
在以下代码
&gr.
中包含组数:

data group1;
    set group;
    array arr_counts(&gr.) var1-var&gr.;
    arr_counts(_n_)= count;
run;
在SAS中,有几种方法可以确定数据集中OB的数量,我最喜欢的方法是:(不适用于视图)


请不要使用proc transpose,因为我需要每行3列,right\u&gr sep\u&gr left\u&gr,这将由一些数据提供,然后是ods输出。此外,我可以使用调用execute来解决这个问题,但如果可能的话,我正在搜索一个不需要时间的解决方案,一个简单的变量声明将非常好。请,不要使用proc transpose,因为我需要每行3列,right_gr&sep_gr&ugr left_gr,这将由一些数据和ods输出提供。此外,我可以通过调用execute来解决这个问题,但如果可能的话,我正在寻找一个不需要时间的解决方案,一个简单的变量声明就好了。非常感谢,这完全改变了我对宏编程的看法。宏变量仅在处理结束时求解。但是,现在,是否不可能在数据集中使用定义在同一数据步骤中的宏变量?您实际上可以使用
symget()
函数或
resolve()
函数在同一数据步骤中获取宏变量的值,但是它们的用处有限,因为它们只在表达式中有效,不能像宏变量引用那样真正使用。非常感谢,这完全改变了我对宏编程的看法。宏变量仅在处理结束时求解。但是,现在,是否不可能在数据集中使用定义在同一数据步骤中的宏变量?您实际上可以使用
symget()
函数或
resolve()
函数在同一数据步骤中获取宏变量的值,但它们的用处有限,因为它们只在表达式中有效,不能像宏变量引用那样真正使用。谢谢,这帮了大忙。使用函数nobs=似乎是一个很好的解决方案,但是现在,有没有一种方法可以将该“a”用作数组长度的参数?类似数组变量[n]$var:?谢谢,这帮了大忙。使用函数nobs=似乎是一个很好的解决方案,但是现在,有没有一种方法可以将该“a”用作数组长度的参数?类似于数组变量[n]$var:?