使用 _n_ 命名变量,一个数据步的每次迭代的列
Naming variable using _n_, a column for each iteration of a datastep
我需要为数据步的每次迭代声明一个变量(对于每个 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.);
和许多其他语句,但 none 有效。
结果始终相同,ds 仅包含 var&gr,其中 &gr 是最大值 n.
PDV似乎每次迭代都覆盖新变量,但名称不同。
请将结果包含在单个数据步骤中,或者至少让代码花费更少的时间。
关于如何实现要求的结果有什么想法吗?
谢谢。
宏变量并不像您想象的那样起作用。任何宏变量引用都在编译时解析,因此您的 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;
如果你不喜欢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;
我需要为数据步的每次迭代声明一个变量(对于每个 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.);
和许多其他语句,但 none 有效。 结果始终相同,ds 仅包含 var&gr,其中 &gr 是最大值 n.
PDV似乎每次迭代都覆盖新变量,但名称不同。 请将结果包含在单个数据步骤中,或者至少让代码花费更少的时间。
关于如何实现要求的结果有什么想法吗?
谢谢。
宏变量并不像您想象的那样起作用。任何宏变量引用都在编译时解析,因此您的 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;
如果你不喜欢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;