【问题标题】:Naming variable using _n_, a column for each iteration of a datastep使用_n_命名变量,一个数据步的每次迭代的列
【发布时间】:2015-05-04 12:44:59
【问题描述】:

我需要为数据步的每次迭代声明一个变量(对于每个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 每次迭代都会覆盖新变量,但名称不同。 请将结果包含在单个数据步中,或者至少让代码花费更少的时间。

知道如何达到要求的结果吗?

谢谢。

【问题讨论】:

  • 请不要使用 proc transpose,因为我每行需要 3 列 right_&gr sep_&gr left_&gr,这将由一些数据提供,然后是 ods 输出。
  • 另外,我可以使用调用执行来解决这个问题,但如果可能的话,我正在寻找不需要那个时间的解决方案,一个简单的变量声明会很棒。

标签: sas


【解决方案1】:

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

如果您知道可以确定最大值_n_,则可以将最大值放入宏变量中并声明一个数组,如下所示:

找到最大值_n_并将值分配给maxn

data _null_;
  set have end=eof;
  if eof then call symput('maxn',_n_);
run;

创建变量:

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

【讨论】:

  • 非常感谢,这完全改变了我对宏编程的看法。宏变量仅在处理结束时求解。但是,现在,是否不可能在数据集中使用定义在同一数据步中的宏变量?
  • 可以使用symget() 函数或resolve() 函数在同一数据步骤中实际获取宏变量的值,但它们的用处有限因为它们只在表达式中有效,不能像宏变量引用那样真正使用。
【解决方案2】:

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

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

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

data group1;
    set group;
    array arr_counts(&gr.) var1-var&gr.;
    arr_counts(_n_)= count;
run;

在 SAS 中有几种方法可以确定数据集中的 obs 数量,我最喜欢的是以下方法:(不适用于视图)

data _null_;
    if 0 then set group nobs=n;
    call symputx('gr',n);
run;

【讨论】:

  • 谢谢,这帮助很大。使用函数 nobs= 似乎是一个很好的解决方案,但是现在,有没有办法使用“a”作为数组长度的参数?类似数组变量[n] $ var: ?
猜你喜欢
  • 1970-01-01
  • 2017-03-06
  • 2019-07-26
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 2020-06-17
相关资源
最近更新 更多